【发布时间】:2016-04-26 23:22:05
【问题描述】:
使用 django 的 ORM annotate() 和/或 aggregate():我想根据一个类别字段进行汇总,然后对每个日期的类别值进行平均。我尝试使用两个 annotate() 语句来做到这一点,但得到了一个 FieldError。
我正在这样做:
queryset1 = self.data.values('date', 'category').annotate(sum_for_field=Sum('category'))
它会输出一个 ValuesQuerySet 对象,其中包含以下内容(因此每个类别值的总和):
[{'category': 'apples', 'date': '2015-10-12', sum_for_field=2000},
{'category': 'carrots', 'date': '2015-10-12', sum_for_field=5000},
{'category': 'apples', 'date': '2015-10-13', sum_for_field=3000},
{'category': 'carrots', 'date': '2015-10-13', sum_for_field=6000}, ...
]
然后我想平均每个日期的 sum_for_field 字段以输出如下内容:
[ {'date': '2015-10-12', avg_final: 3500},
{'date': '2015-10-13', avg_final: 4500}, ...
]
我试过这样做:
queryset2 = queryset1.values('date', 'sum_for_field')
result = queryset2.annotate(avg_final=Avg('sum_for_field'))
但我得到了这个FieldError:
FieldError: FieldError: Cannot compute Avg('sum_for_field'): 'sum_for_field' is an aggregate
【问题讨论】:
-
您需要将
.annotate()更改为.aggregate()。有关更多信息,请参阅文档:docs.djangoproject.com/en/1.9/topics/db/aggregation -
@jape 为什么不将其添加到答案中,并参考provides an example 的文档。
-
那个例子不是我想要的。
-
@EminMastizada 这不是重复的,因为相关的结果是按组求和的一个平均值。可以用一条SQL来表达。这个假定的重复问题需要许多结果平均值,因此使用 group by 嵌套查询。然而,Django 1.11 中的新 Subquery 类还不够。