Django--orm系统-指令&属性
# 内容回顾(django路由系统)
# 1.urlconf
from django.conf.urls import url
from . import views
urlpatterns = [
# url(r'^admin/', admin.site.urls),
url(r'^home/$', views.home,{}, name='home'),
]
2
3
4
5
6
7
8
# 2.正则表达式
r ^ $ [0-9] \d \w + ? * {4}
# 3.分组和命名分组
url上捕获参数 都是字符串
分组
url(r'^blog/([0-9]{4})/(\d{2})$', views.blogs, name='blogs'),
捕获的参数会按照位置传参传递给视图函数
命名分组
url(r'^blog/(?P<year>[0-9]{4})/(?P<month>\d{2})$', views.blogs, name='blogs'),
捕获的参数会按照关键字传参传递给视图函数
# 4.路由分发 include
from django.conf.urls import url, include
from django.contrib import admin
from app01 import views
urlpatterns = [
# url(r'^admin/', admin.site.urls),
url(r'^app01/', include('app01.urls', namespace='app01')),
url(r'^app02/', include('app02.urls', namespace='app02')),
]
2
3
4
5
6
7
8
9
10
# 5.传递参数
url(r'^home/(?P<year>\d{4})$', views.home,{'year':2019}, name='home'),
# 6.url的命名和反向解析
静态路由
命名:
url(r'^home/$', views.home, name='home'),
反向解析:
模板
{% url 'home' %} ——》 '/app01/home/'
py文件
from django.urls import reverse
reverse('home') ——》 '/app01/home/'
分组:
命名:
url(r'^blog/([0-9]{4})/(\d{2})$', views.blogs, name='blogs'),
反向解析:
模板
{% url 'blogs' '2019' '06' %} ——》 '/app01/blog/2019/06'
py文件
from django.urls import reverse
reverse('blogs,'args=('2019','07')) ——》 '/app01/blog/2019/07'
命名分组:
命名:
url(r'^blog/(?P<year>[0-9]{4})/(?P<month>\d{2})$', views.blogs, name='blogs'),
反向解析:
模板
{% url 'blogs' '2019' '06' %} ——》 '/app01/blog/2019/06' 按照位置传参
{% url 'blogs' month='06' year='2019' %} ——》 '/app01/blog/2019/06' 按照关键字传参
py文件
from django.urls import reverse
reverse('blogs,'args=('2019','07')) ——》 '/app01/blog/2019/07' 按照位置传参
reverse('blogs',kwargs={'year':'2018','month':'08'}) ——》 '/app01/blog/2018/08' 按照关键字传参
# 7.namespace
url(r'^app01/', include('app01.urls', namespace='app01')),
{% url 'app01:home' %} ——》 '/app01/home/'
reverse('app01:home') ——》 '/app01/home/'
# 1.orm的字段和参数
orm字段--orm -----Object Relational Mapping
AutoField #设置自增主键 IntegerField #设置整数 CharField #设置字符串 BooleanField #设置布尔值 TextField #设置文本 DateTimeField #设置日期时间 auto_now_add=True # DateTime参数 --表示新增数据的时候会自动保存当前的时间 auto_now=True # DateTime参数 --表示新增、修改数据的时候会自动保存当前的时间 DateField #设置日期时间 auto_now_add=True # DateTime参数 --表示新增数据的时候会自动保存当前的时间 auto_now=True # DateTime参数 --表示新增、修改数据的时候会自动保存当前的时间 DecimalField #十进制的小数 max_digits # DecimalField属性 小数总长度 5 decimal_places # DecimalField属性 小数位长度 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15自定义字段(了解)
字段参数
null = Ture # 数据库中字段可以为空 blank=True #form表单填写时可以为空 default # 字段的默认值 db_index=True # 创建索引 unique #值唯一 edittable=True #可编辑 hrlptext='提示信息' choices=((0, '女'), (1, '男')) #可填写的内容和提示
1
2
3
4
5
6
7
8
class Person(models.Model):
pid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
age = models.IntegerField(default=18)
birth = models.DateTimeField(auto_now_add=True)
phone = models.CharField(max_length=11,null=True,blank=True)
gender= models.BooleanField('性别',choices=((0, '女'), (1, '男'))) #选择性别,默认为0
2
3
4
5
6
7
# 2.表的参数(了解)
class Person(models.Model):
pid = models.AutoField(primary_key=True)
class Meta:
db_table = "person" # 表名
verbose_name = '个人信息'
verbose_name_plural = '个人信息'
index_together = [
("name", "age"), # 联合索引,应为两个存在的字段
]
unique_together = (("name", "age"),) # 应为两个存在的字段
2
3
4
5
6
7
8
9
10
11
12
13
# 3. ORM查询(13条) 必知必会13条
#all() 获取所有的数据 ——》 QuerySet 对象列表
ret = models.Person.objects.all()
# get() 获取满足条件的一个数据 ——》 对象
# 获取不到或者多个都报错
ret = models.Person.objects.get(pk=1)
# filter() 获取满足条件的所有数据 ——》 QuerySet 对象列表
ret = models.Person.objects.filter(pk=1)
# exclude() 获取不满足条件的所有数据 ——》 QuerySet 对象列表
ret = models.Person.objects.exclude(pk=1)
# values()拿到对象所有的字段和字段的值 QuerySet [ {} ,{} ]
# values('字段') 拿到对象指定的字段和字段的值 QuerySet [ {} ,{} ]
ret = models.Person.objects.values('pid','name')
# values_list() 拿到对象所有的字段的值 QuerySet [ () ,() ]
# values('字段') 拿到对象指定的字段的值 QuerySet [ {} ,{} ]
ret = models.Person.objects.values_list('name','pid')
# order_by 排序 - 降序加一个负号 ——》 QuerySet [ () ,() ]
ret = models.Person.objects.all().order_by('age','-pid') #传多个参数
# reverse 反向排序 只能对已经排序的QuerySet进行反转
ret = models.Person.objects.all()
ret = models.Person.objects.all().reverse()
# distinct 去重 完全相同的内容才能去重
ret = models.Person.objects.values('age').distinct()
# count() 计数
ret = models.Person.objects.all().count()
# first 取第一元素 没有元素 None
# last 取最后一元素 没有元素 None
ret = models.Person.objects.filter(pk=1).values().first()
# exists 查询的数据是否存在
ret = models.Person.objects.filter(pk=1000).exists()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
帮助记忆
#返回queryset all() filter() exclude() values() values_list() order_by() reverse() distinct() #返回对象 get() first() last() #返回数字 count() #返回布尔值的 exists()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 4.单表双下划线
ret = models.Person.objects.filter(pk=1) # 等于1的
ret = models.Person.objects.filter(pk__gt=1) # gt greater than 大于1的
ret = models.Person.objects.filter(pk__lt=3) # lt less than 小于3的
ret = models.Person.objects.filter(pk__gte=1) # gte greater than equal 大于等于1的
ret = models.Person.objects.filter(pk__lte=3) # lte less than equal 小于等于
ret = models.Person.objects.filter(pk__range=[2,3]) # range 范围
ret = models.Person.objects.filter(pk__in=[1,3,10,100]) # in 成员判断
ret = models.Person.objects.filter(name__contains='A') #内容中包含A的
ret = models.Person.objects.filter(name__icontains='A') # 忽略大小写
ret = models.Person.objects.filter(name__startswith='a') # 以什么开头
ret = models.Person.objects.filter(name__istartswith='A') # 忽略大小写
ret = models.Person.objects.filter(name__endswith='a') # 以什么结尾
ret = models.Person.objects.filter(name__iendswith='I') # 忽略大小写
ret = models.Person.objects.filter(birth__year='2019') #取年份
ret = models.Person.objects.filter(birth__contains='2018-06-24')
ret = models.Person.objects.filter(phone__isnull=False) #取不为空的
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 5.外键的操作
在多表关联后,产生外键.
class Publisher(models.Model): name = models.CharField(max_length=32, verbose_name="名称") class Book(models.Model): title = models.CharField(max_length=32) pub = models.ForeignKey(Publisher, related_name='books',related_query_name='xxx',on_delete=models.CASCADE)
1
2
3
4
5
6
7正反向查询
- 从一查多查询时通过类名_set()查询
- 从多查一的时候,直接通过外键查询
# 基于对象的查询 # 正向 book_obj = models.Book.objects.get(title='菊花怪大战MJJ') # print(book_obj.pub) # 反向 pub_obj = models.Publisher.objects.get(pk=1) # print(pub_obj.book_set.all()) # 类名小写_set 没有指定related_name # print(pub_obj.books.all()) # 指定 related_name='books' # 基于字段的查询 ret = models.Book.objects.filter(title='菊花怪大战MJJ') # 查询老男孩出版的书 ret = models.Book.objects.filter(pub__name='老男孩出版社') # 查询出版菊花怪大战MJJ的出版社 # 没有指定related_name 类名的小写 ret= models.Publisher.objects.filter(book__title='菊花怪大战MJJ') # related_name='books' ret= models.Publisher.objects.filter(books__title='菊花怪大战MJJ') # related_query_name='xxx'(了解) ret= models.Publisher.objects.filter(xxx__title='菊花怪大战MJJ')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27