有没有办法在Django中对聚合进行分组?

时间:2018-02-28 01:57:45

标签: python django django-1.8

我们目前正在使用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翻译的一个例子(这个是使用this answer中的Month类,但我尝试了几种变体):

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

此处还有一些额外的聚合,但为了清晰起见,我删除了它。我不在乎Django输出最终看起来像是按月分组。

1 个答案:

答案 0 :(得分:1)

试试这个

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},
]


你在寻找吗?