當前位置:
首頁 > 知識 > django之聚合查詢,分組查詢,F查詢和Q查詢

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)

django之聚合查詢,分組查詢,F查詢和Q查詢

打開今日頭條,查看更多精彩圖片
喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

21 個令程序員淚流滿面的瞬間
查看Linux內核源碼技巧的記錄

TAG:程序員小新人學習 |