有什么方法可以在 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},
]
是你要找的吗?
我们目前使用的是 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')
您可以通过
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},
]
是你要找的吗?