Djang-orm花式查询数据

django-orm的花式查询数据


  1. __exact=‘aaa’ 精确等于 'like ‘aaa’
  2. __iexact=‘aaa’ 精确等于 忽略大小写的like ‘aaa’
  3. __contains=‘aaa’ 查询内容包含 like ‘%aaa%’
  4. __gt 大于
  5. __gte 大于等于
  6. __lt 小于
  7. __lte 小于等于
  8. __in 存在于一个list范围之内
  9. __startswith 以…开头 like ‘%aaa’
  10. __istartswith 以…开头 忽略大小写 like ‘%aAa’
  11. __endswith 以…结束 like ‘aaa%’
  12. __iendswith 以…结束 忽略大小写 like ‘aAa%’
  13. __range(start,end) 在…范围内
  14. __year 日期字段的年份
  15. __month 日期字段的月份
  16. __day 日期字段的日
  17. __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对象


  1. F对象可以使用模型的A属性与B属性进行比较
from django.db.model import F

obj = Model.objects.filter(girl_num__gt=F('boy_num')) 
  1. F对象支持算术运算
object = Model.objects.filter(girl_num__gte=F('boy_num')+20)
  1. F对象的参数如果是datetime/time,可以进行日期的加减运算:
obj = Model.objects.filter(create_time__lt=F('create_at')+timedelta(days=5))

2019-08-08

你可能感兴趣的:(django)