Django 的 annotate()
函数用于对 Queryset 进行注释(对每个对象添加附加数据),通常用于数据聚合(如计算总和、平均值、最大值等)。
annotate()
用法为:
queryset.annotate(附加项=聚合函数('字段名'))
其中,聚合函数可以是 Count
(计数)、Sum
(求和)、Avg
(求平均值)、Max
(求最大值)或 Min
(求最小值),其中,Count
函数可以直接传递参数表示计数项。
例如:
from django.db.models import Count, Sum
from myapp.models import MyModel
# 计算每个 my_field1 值的个数
results = MyModel.objects.values('my_field1').annotate(num_my_field1=Count('my_field1')).order_by('-num_my_field1')
# 计算每个 my_field1 值的数量和平均值
results = MyModel.objects.values('my_field1').annotate(num_my_field1=Count('my_field1'), // 'my_field1' 的数量
avg_my_field2=Avg('my_field2')) // 'my_field1' 的平均值
在第一个示例中,我们对 MyModel 模型的 my_field1
字段进行计数,并使用 order_by()
函数按照计数值进行降序排序。在第二个示例中,我们计算了每个 my_field1
值的数量和平均值,并将结果存储在 num_my_field1
和 avg_my_field2
注释项中。
annotate()
函数也可以用于递归注释,即注释中可以包含其他注释项。例如:
from django.db.models import Count, Sum
from myapp.models import MyModel
# 计算每个 my_field1 值的数量和平均值,并为平均值再次添加注释
results = MyModel.objects.annotate(num_my_field1=Count('my_field1'),
avg_my_field2=Avg('my_field2')
).annotate(avg=Avg('avg_my_field2')).order_by('-avg')
在这个示例中,我们首先注释了每个 my_field1
值的数量和平均值,然后再次注释这些值的平均值,并按照该值进行排序。
总之,annotate()
函数是 Django 中非常有用的一个函数,它可以根据需要注释计算其他附加数据,并在查询结果中返回这些注释。如果你需要使用聚合函数实现一些高级的计算或分析,annotate()
函数是非常实用的。