有什么方法可以在 Django 中对聚合进行分组?

Any way to group aggregations in Django?

我们目前使用的是 Django 1.8 和 Postgres。

我有一个要执行的聚合,但我希望聚合按月分组。这在 SQL 中是微不足道的,但我似乎无法想出任何方法来使用 Django ORM。

这是我正在执行的 SQL 查询的示例,它提供了所需的结果 (SQL Fiddle):

SELECT 
    EXTRACT(month from date) as month,
    EXTRACT(year from date) as year,
    SUM(total) as total
FROM transaction
GROUP BY year, month ORDER BY year, month;

这是我翻译成 Django 的例子(这个是使用 中的 Month class,但我尝试了几种变体):

results = Transactions.all().annotate(month=Month('date')).aggregate(total=Sum('total', output_field=DecimalField()))

这里还有一些额外的聚合,但为了清楚起见,我删除了它。只要按月分组,我不在乎 Django 输出最终会是什么样子。

试试这个

results=Transactions.objects.annotate(month=Month('date'),year = Year('date')).values('month','year').annotate(total=Sum('total', output_field=DecimalField())).order_by('year','month')


您可以通过

查看相应ORM的raw sql query
print(results.query)


它会提供一个结果

[
    {'month': 1, 'year': 2017, 'total': 139522},
    {'month': 2, 'year': 2017, 'total': 560086},
    {'month': 3, 'year': 2017, 'total': 1292125},
    {'month': 1, 'year': 2018, 'total': 77058413},
    {'month': 2, 'year': 2018, 'total': 99205278},
]


是你要找的吗?