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

聚合查询

from django.db.models import Max, Min, Sum, Count, Avg

# 关键字 aggregate
res1 = models.Book.objects.all().aggregate(Max('price'))
res2 = models.Book.objects.all().aggregate(Min('price'))
res3 = models.Book.objects.all().aggregate(Sum('price'))
res4 = models.Book.objects.all().aggregate(Count('price'))
res5 = models.Book.objects.all().aggregate(Avg('price'))
print(res1, res2, res3, res3, res4, res5)

分组查询

from django.db.models import Max, Min, Sum, Count, Avg

# 关键字 annotate
# 统计每本书作者的个数
res1 = models.Book.objects.annotate(author_count=Count('authors')).values('author_count')
print(res1)
# 统计每个出版社最便宜的书
res2 = models.Publish.objects.annotate(min_price=Min('book__price')).value('min_price')
print(res2)

F与Q查询

F查询

from django.db.models import F

# 查询卖出数量大于库存数量的书
book_queryset = models.Book.objects.filter(sail__gl=F('store'))
print(book_queryset)

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)
   
# select_related与prefetch_related区别
# select_related内部自动连表,连表的时候比较消耗资源,但走数据库的次数少
# prefetch_related内部不做连表,多次查询的时候比较消耗资源,但刚给用户的感觉和连表操作一样

+++++++++++++

猜你喜欢

转载自www.cnblogs.com/zj420255586/p/11747726.html