django-orm的花式查询数据
- __exact=‘aaa’ 精确等于 'like ‘aaa’
- __iexact=‘aaa’ 精确等于 忽略大小写的like ‘aaa’
- __contains=‘aaa’ 查询内容包含 like ‘%aaa%’
- __gt 大于
- __gte 大于等于
- __lt 小于
- __lte 小于等于
- __in 存在于一个list范围之内
- __startswith 以…开头 like ‘%aaa’
- __istartswith 以…开头 忽略大小写 like ‘%aAa’
- __endswith 以…结束 like ‘aaa%’
- __iendswith 以…结束 忽略大小写 like ‘aAa%’
- __range(start,end) 在…范围内
- __year 日期字段的年份
- __month 日期字段的月份
- __day 日期字段的日
- __isnull=True/False 是否为空
检索特定对象
filter(**kwargs)
返回一个与参数匹配的QuerySet,相当于等于(=)
exclude(**kwargs)
返回一个与参数不匹配的QuerySet,相当于不等于(!=)
Model.objects.filter(create_time__year=2019)
等同于SQL语句 select * from model where create_time_year='2019'
链式查询
Model.objects.filter(
name__startswith='张'
).exclude(
id__gte=188
).filter(
create_time__gte=datetime(2018,10,10)
)
等同于
select * from model where name like '张%' and id>=188 and create_time>'2018-10-10'
又或者是这样
QuerySet1 = Model.objects.filter(name__startswith='张')
QuerySet2 = QuerySet1.exclude(id__gte=188)
QuerySet3 = QuerySet1.filter(create_time__gte=datetime(2018,10,10))
这种方法的好处是可以对所有查询属性可以重用。
而且QuerySet是延迟属性,只有当使用到数据库时,才会去访问数据库
切片大法
obj = Model.objects.all()[:5]
- 取查询集的前五个
obj = Model.objects.all()[5:10]
- 取第五到第十个之间的数据
obj = Model.objects.all()[0:10:2]
- 取第0个开始,第十个结束,步长为2的数据
obj = Model.objects.order_by('create_time')[0]
- 按照create_time字段进行排序(默认升序)后取第一个对象
obj = Model.objects.filter(create_time__lte='2018,10,10')
- 等同于
SELECT * FROM model WHERE create_time<=2018-10-10;
obj = Model.objects.get(name__iexact='kre_kre')
- 查找kre__kre对象,不区分大小写。
obj = Model.objects.filter(name__contains='王')
- 查找name包含王字的,等同于
SELECT * FROM model WHERE name LIKE '%王%'
obj = Model.objects.filter(second_table__author_name__isnull=True)
- 查询Model表中外键关系second_table表中的author_name字段为空的数据。
obj = Model.objects.filter(second_table__author_name__isnull=False,second_table__author_name__is)
- 多表查询外键。。。表与表之间用"__"(双下划线)连接
obj = Model.objects.get(id__exact=14)
,obj = Model.objects.get(id=14)
,obj = Model.objects.get(pk=14)
- 上述三种查询方式是相同的,等同于
select * from model where id=14;
obj = Model.objects.filter(pk__in=[1,3,5,7,9])
- 等同于
select * from model where id in {1,3,5,7,9};
Model.objects.filter(name__contains='%')
- 等同于
select * from model where name like '%\%%';
[e.id for e in Model.objects.all()]
- 上述表达式应写为
query_set = Model.objects.all()
[e.id for e in query_set]
- 这样可以利用缓存,减少查询数据库的次数
利用Q对象实现复杂查询
from django.db.model import Q
from datetime import datetime
obj = Model.objects.filter(Q(question__startswith='who')|Q(question__startswith='what'))
等同于:select * from model where question like 'who%' or question like 'what%'
query_set = Model.objects.filter(
Q(create_time__gte=datetime(2018,10,10)) | Q(
create_time__lte=datetime(2019,10,10)),
name__startswith='张'
)
等同于:select * from model where name like '张%' and create_time >= '2018-10-10' and create_time <= '2019-10-10';
亦可写为:
query_set = Model.objects.filter(
name__startswith='张',
Q(create_time__range(
datetime(2018,10,10),datetime(2019,10,10)
))
)
F对象
- F对象可以使用模型的A属性与B属性进行比较
from django.db.model import F
obj = Model.objects.filter(girl_num__gt=F('boy_num'))
- F对象支持算术运算
object = Model.objects.filter(girl_num__gte=F('boy_num')+20)
- F对象的参数如果是datetime/time,可以进行日期的加减运算:
obj = Model.objects.filter(create_time__lt=F('create_at')+timedelta(days=5))
2019-08-08