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'))