聚合就是指mysql中的 Avg、Sum、Max、… 聚合函数
aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典。
键的名称是聚合值的标识符,值是计算出来的聚合值。键的名称是按照字段和聚合函数的名称自动生成出来的。
#部门类
class Dept(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
#员工类
class Employee(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
salary = models.IntegerField()
dept = models.ForeignKey(to='Dept',to_field='id',on_delete=models.CASCADE)
#聚合函数aggregate()
ret = models.Employee.objects.all().aggregate(Avg('salary'))
print(ret)
#{'salary__avg': 35.166666666666664}
ret = models.Employee.objects.all().aggregate(avg = Avg('salary'))
print(ret)
#{'avg': 35.166666666666664}
ret = models.Employee.objects.all().aggregate(
avg = Avg('salary'),
sum = Sum('salary'),
max = Max('salary'),
min = Min('salary')
)
print(ret)
#{'min': 12, 'max': 98, 'avg': 35.166666666666664, 'sum': 211}
分组
分组查询指 mysql中的 group by … having
values() 中写哪个字段就是按照那个字段进行分组
#正向查询
ret = models.Employee.objects.values('dept').annotate(Avg('salary'))
print(ret)
#<QuerySet [{'salary__avg': 48.0, 'dept': 1},
# {'salary__avg': 22.333333333333332, 'dept': 2}]>
#反向查询
ret = models.Dept.objects.annotate(avg = Avg('employee__salary')).values('name','avg')
print(ret)
#<QuerySet [{'name': '销售部', 'avg': 48.0},
# {'name': '研发部', 'avg': 22.333333333333332}]>