聚合函数
Django提供了如下的聚合函数:
Avg: 求平均值
Count: 求数量
Max: 求最大值
Min: 求最小值
StdDev: 求标准差
Sum: 求和
Variance:求差额
注:聚合函数通常作为aggregate()方法的查询表达式使用。
1、默认情况下,聚合函数返回的值为:字段名__小写的聚合函数名称
>>> from faps.models import scores
>>> from django.db.models import Avg,Max,Min
>>> scores.objects.aggregate(Avg("yw"),Max("yw"),Min("yw"))
{'yw__max': '99', 'yw__avg': 73.6774193548387, 'yw__min': '100'}
2、查询表达式中指定聚合函数的返回值
>>> scores.objects.aggregate(ywavg=Avg("yw"),ywmax=Max("yw"),Min("yw"))
File "", line 1
SyntaxError: positional argument follows keyword argument
【注】:如果使用别名,必须全部聚合函数都得使用,否则报语法错误
>>> scores.objects.aggregate(ywavg=Avg("yw"),ywmax=Max("yw"),ywmin=Min("yw"))
{'ywavg': 73.6774193548387, 'ywmin': '100', 'ywmax': '99'}
3、结合使用values()和annotate()方法,实现分类汇总,即实现sql中的group by功能
如:按bj分类后计算yw和sx字段的平均值-(返回是一个结果集)
>>> scores.objects.values("bj").annotate(Avg("yw"),Avg("sx"))
'bj': 'class2', 'sx__avg': 44.333333333333336}, {'yw__avg': 69.625, 'bj': 'class3', 'sx__avg': 51.5}]>
遍历返回的结果集
>>> ds=scores.objects.values("bj").annotate(Avg("yw"),Avg("sx"))
>>> for a in ds:
... print(a["bj"],a["yw__avg"],a["sx__avg"])
...
class1 79.58823529411765 55.294117647058826
class2 73.52380952380952 44.333333333333336
class3 69.625 51.5
【注】:在分类汇总时,应注意values()方法应总是在annotate()方法之前,如果位置调换,则得出结果有误
>>> scores.objects.annotate(Avg("yw"),Avg("sx")).values("bj")
'class1'}, {'bj': 'class1'}, {'bj': 'class1'}, {'bj': 'class1'}, {'bj': 'class1'}, {'bj': 'class1'}, {'bj': 'class1'}, {'bj': 'class1'}, {'bj': 'class1'}, {'bj':
'class2'}, {'bj': 'class2'}, {'bj': 'class2'}, '...(remaining elements truncated)...']>