Django ORM聚合和分組查詢


聚合查詢

aggregate()是QuerySet 的一個終止子句,意思是說,它返回一個包含一些鍵值對的字典。鍵的名稱是聚合值的標識符,值是計算出來的聚合值。鍵的名稱是按照字段和聚合函數的名稱自動生成出來的。

from django.db.models import Max,Avg,F,Q models.Book.objects.all().aggregate(Avg("price")) {'price__avg': 192.593333}

如果你想要為聚合值指定一個名稱,可以向聚合子句提供它。

models.Book.objects.all().aggregate(avg_price=Avg("price")) {'avg_price': 192.593333}

如果你希望生成不止一個聚合,你可以向aggregate()子句中添加另一個參數。所以,如果你也想知道所有圖書價格的最大值和最小值,可以這樣查詢:

from django.db.models import Max,Avg,F,Q,Min,Count,Sum models.Book.objects.all().aggregate(Avg("price"),Max("price"),Min("price"),Sum("price")) {'price__avg': 192.593333, 'price__max': Decimal('233.33'), 'price__min': Decimal('111.12'), 'price__sum': Decimal('577.78')}

分組查詢

為調用的QuerySet中每一個對象都生成一個獨立的統計值 
統計每一本書的作者個數

models.Book.objects.all().annotate(authorNum=Count("author")) <QuerySet [<Book: 書一>, <Book: 書二>, <Book: 書三>]> book_list = models.Book.objects.all().annotate(authorNum=Count("author")) for i in book_list: print(i.authorNum) 2 2 1

 

統計出每個出版社買的最便宜的書的價格 
方法一

pulisher_list = models.Publisher.objects.all().annotate(min_price=Min("book__price")) for i in pulisher_list: print(i.min_price) 111.12 12.00 456.00 785.00

方法二

tmp = models.Book.objects.all().values("author__name").annotate(min_price=Min("price")) for i in tmp: print(i.min_price) Traceback (most recent call last): File "<input>", line 2, in <module> AttributeError: 'dict' object has no attribute 'min_price' for i in tmp: print(i) {'author__name': '小一', 'min_price': Decimal('111.12')} {'author__name': '小二', 'min_price': Decimal('233.33')} {'author__name': '小三', 'min_price': Decimal('111.12')} {'author__name': None, 'min_price': Decimal('12.00')}

統計不止一個作者的圖書

tmp = models.Book.objects.all().annotate(au=Count("author")).filter(au__gt=1) tmp <QuerySet [<Book: 書一>, <Book: 書二>]>

根據一本圖書作者數量的多少對查詢集 QuerySet進行排序

tmp = models.Book.objects.all().annotate(au=Count("author")).order_by("au") tmp <QuerySet [<Book: 書四>, <Book: 書五>, <Book: 書六>, <Book: 書三>, <Book: 書一>, <Book: 書二>]> 

 

查詢各個作者出的書的總價格

tmp = models.Author.objects.all().annotate(total=Sum("books__price")).values("name","total") tmp <QuerySet [{'name': '小一', 'total': Decimal('344.45')}, {'name': '小二', 'total': Decimal('689.33')}, {'name': '小三', 'total': Decimal('111.12')}, {'name': '小四', 'total': None}]>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM