django之聚合查詢,分組查詢,F查詢和Q查詢
一,聚合查詢
需要先在文檔的上面導入(在其他需要使用聚合查詢的時候都需要導入):
from django.db.models import Avg,Count,Max,Min,Sum
聚合查詢aggregate
aggregate()是QuerySet 的一個終止子句:意思是說,它返回一個包含一些鍵值對的字典。鍵的名稱是聚合值的標識符,值是計算出來的聚合值。鍵的名稱是按照字段和聚合函數的名稱自動生成出來的。如果你想要爲聚合值指定一個名稱,可以向聚合子句提供它。
# 聚合查詢 aggregate
from django.db.models import Max,Min,Count,Avg,Sum
# 計算所有圖書的平均價格
ret = Book.objects.all().aggregate(Avg('price'))
print(ret)
# 計算所有圖書的最高價格
ret = Book.objects.aggregate(Max('price'))
print(ret)
# 計算圖書的最高價格,最低價格,平均價格,總數和總和
ret = Book.objects.aggregate(Avg('price'),Max('price'),Min('price'),Sum('price'),Count('price'))
print(ret)
二,分組查找
分組查詢(以誰做分組,就以誰做基表)annotate()
總結:values()出現在annotate()之前,相當於mysql中的,order by.values()出現在annotate()之後相當於取值
filter()出現在annotate()之前,相當於mysql中的,where.values()出現在annotate()之後相當於mysql中的,having
# 分組查詢 annotate()
# 統計每一本書作者的個數
ret = Book.objects.all().annotate(c=Count('authors'))
print(ret)
for r in ret:
print(r.name, '---->', r.c)
ret = Book.objects.all().annotate(c=Count('authors')).values('name', 'c')
print(ret)
# 統計每個出版社的最便宜的書
ret = Publish.objects.all().annotate(c=Min('book__price')).values('name', 'c')
print(ret)
# 統計不止一個作者的圖書
ret = Book.objects.all().annotate(c=Count('authors')).filter(c__gt=1).values('name')
print(ret)
三,F查詢
F爲了字段=後面的值,不能放字段,所以用F函數包裹
# F查詢
from django.db.models import F
# 把所有圖書的價格加1
ret = Book.objects.all().update(price=F('price')+1)
print(ret)
四,Q函數
Q爲了構造與&,或|,非~的關係
# Q函數
from django.db.models import Q
# 查詢作者的名字爲魯迅或者巴金的書
ret = Book.objects.filter(Q(authors__name='魯迅')|Q(authors__name='巴金')).values('name')
print(ret)
# 查詢作者不是魯迅的書
ret = Book.objects.filter(~Q(authors__name='魯迅')).values('name')
print(ret)
查看原文 >>