我们目前正在使用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输出最终看起来像是按月分组。
答案 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')
您可以通过
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},
]
你在寻找吗?