django.db.models
下面aggregate
.示例代碼以下result = Book.objects.aggregate(Avg("price"))
filed+__+聚合函數名字
造成的.好比以上代碼造成的名字叫作price__avg
.若是不想使用默認的名字,那麼能夠在使用聚合函數的時候傳遞關鍵字參數進去,參數的名字就是聚合函數執行完成後的名字.示例代碼以下:result = Book.objects.aggregate(avg=Avg("price"))
avg=AVG('price')
,那麼之後Avg
聚合函數執行完成的名字叫作avg
aggregate
:這個辦法不會返回一個QuerySet
對象,而是返回一個字典.這個字典中的能夠就是聚合函數的名字,值就是聚合函數執行後的結果.aggregate
和annotate
的相同和不一樣:javascript
aggregate
返回的是一個字典,在這個字典中存儲的是這個聚合函數執行的結果。而annotate
返回的是一個QuerySet
對象,而且會在查找的模型上添加一個聚合函數的屬性。aggregate
不會作分組,而annotate
會使用group by
子句進行分組,只有調用了group by
子句,才能對每一條數據求聚合函數的值。Count
:用來求某個數據的個數。好比要求全部圖書的數量,那麼能夠使用如下代碼:html
result = Book.objects.aggregate(book_nums=Count("id"))
而且Count
能夠傳遞distinct=True
參數,用來剔除那些重複的值,只保留一個。好比要獲取做者表中,不一樣郵箱的個數,那麼這時候能夠使用distinct=True
。示例代碼以下:java
result = Author.objects.aggregate(email_nums=Count('email',distinct=True))
Max
和Min
:求指定字段的最大值和最小值。示例代碼以下:python
result = Author.objects.aggregate(max=Max("age"),min=Min("age"))
Sum
:求某個字段值的總和。示例代碼以下:ios
result = BookOrder.objects.aggregate(total=Sum('price'))
aggregate
和annotate
方法能夠在任何的QuerySet
對象上調用。所以只要是返回了QuerySet
對象,那麼就能夠進行鏈式調用。好比要獲取2018年度的銷售總額,那麼能夠先過濾年份,再求聚合函數。示例代碼以下:web
BookOrder.objects.filter(create_time__year=2018).aggregate(total=Sum('price'))