Django4.0 聚合-在QuerySet上生成聚合

2022-03-16 17:34 更新

Django 提供了兩種生成聚合的方法。第一種方法是從整個 ?QuerySet ?生成匯總值。比如你想要計算所有在售書的平均價格。Django 的查詢語法提供了一種用來描述所有圖書集合的方法:

>>> Book.objects.all()

可以通過在 ?QuerySet ?后添加 ?aggregate()? 子句來計算 ?QuerySet ?對象的匯總值。

>>> from django.db.models import Avg
>>> Book.objects.all().aggregate(Avg('price'))
{'price__avg': 34.35}

本例中的 ?all()? 是多余的,所以可以簡化成這樣的:

>>> Book.objects.aggregate(Avg('price'))
{'price__avg': 34.35}

傳遞給 ?aggregate()? 的參數(shù)描述了我們想要計算的聚合值。在這個例子里,要計算的就是 Book 模型上的 price 字段的平均值。
?aggregate()? 是 QuerySet 的一個終端子句,使用后將返回“name-value”的字典,其中“name”就是聚合值的標志,“value”就是計算出的聚合結(jié)果。“name”是根據(jù)字段名和聚合函數(shù)而自動生成的。如果你想指定一個聚合值的名稱,你可以在指定聚合子句的時候提供指定的名稱:

>>> Book.objects.aggregate(average_price=Avg('price'))
{'average_price': 34.35}

如果你想生成更多的聚合內(nèi)容,你需要在 ?aggregate()? 子句中加入其它參數(shù)即可。所以,如果我們也想知道所有書中最高和最低的價格,我們可以寫這樣的查詢:

>>> from django.db.models import Avg, Max, Min
>>> Book.objects.aggregate(Avg('price'), Max('price'), Min('price'))
{'price__avg': 34.35, 'price__max': Decimal('81.20'), 'price__min': Decimal('12.99')}


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號