聚合与分组查询,F与Q查询

Posted zj420255586

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了聚合与分组查询,F与Q查询相关的知识,希望对你有一定的参考价值。

from django.db.models import Q

查询书籍名称是python入门或者价是555.55的书

book_queryset = models.Book.objects.filter(Q(‘title‘=‘python入门‘)|Q(‘price‘=555.55))
print(book_queryset)

Q查询进阶用法 用Q产生对象 然后再使用

q = Q()
q.connector(‘or‘)

添加查询条件 title__icontains为查询条件,同其他查询方式的写法
q.children.append((‘title__icontains‘, ‘p‘))
res = modles.Book.objects.filter(q)
print(res)

惰性查询

res1 = modles.Book.objects.all()
res2 = modles.Book.objects.values(‘title‘)

only会将括号内字段对应的值,直接封装在返回的对象中,点该字段,不会再去数据库查询,但如果点的不是括号内的字段,就会去数据库查询

res3 = modles.book.objects.only(‘title‘)

for r in res1:
print(r.title)

defer会将除括号内的字段之外的其他字段对应的值,直接封装在返回的对象中,点其他字段,不会再去数据库查询,如果点该字段,就会去数据库查询

res4 = modles.Book.objects.defer(‘tilte‘)
for r in res4:
print(r.title)

select_related会自动进行连表查询,然后将连表之后的数据全部查询出来并封装在返回的对象中

select_related括号内只能放外键字段,并且不能是多对多字段

如果括号内外键字段所关联的表中还有外键字段,还可以继续连表 select_related(外键字段_外键字段_外键字段...)

res5 = modles.Book.objects.select_related(‘publish‘)
for r in res5:
print(r.publish.name)

prefetch_related 看起来像连表查询,其实类似于子查询

prefetch_related括号内只能放外键字段,且不能是多对多字段

如果括号内外键字段所关联的表中还有外键字段,还可以继续连表 prefetch_related(外键字段_外键字段_外键字段...)

res6 = modles.Book.objects.prefetch_related(‘author‘)
for r inb res6:
print(r.author.name)

面试经常问的问题1:only与defer的区别

面试经常问的问题2:select_related与prefetch_related区别

select_related内部自动连表,连表的时候比较消耗资源,但走数据库的次数少

prefetch_related内部不做连表,多次查询的时候比较消耗资源,但刚给用户的感觉和连表操作一样

以上是关于聚合与分组查询,F与Q查询的主要内容,如果未能解决你的问题,请参考以下文章

Django框架08 /聚合查询分组F查询和Q查询执行原生sql设置 sql_mode

orm聚合查询分组查询F查询和Q查询

django 中的聚合函数,分组函数,F 查询, Q查询

$Django 聚合函数分组查询F,Q查询orm字段以及参数

[Django框架之ORM操作:多表查询,聚合查询分组查询F查询Q查询choices参数]

使用聚合函数及F/Q及分组查询