我们开发了一种反腐败分析工具,用于分析政府交易并显示可视化图表。
我们有一个"交易"表,列为:id、付款人、收款人、金额和created_at
例如:
1. "Kyiv CityHoll" | "Microsoft" | $130 | 2016.12.02
2. "Odessa CityHoll" | "Microsoft" | $100 | 2016.12.02
3. "Kyiv CityHoll" | "Google" | $1000 | 2016.12.02
4. ...
如何:
1.按付款人(例如"Kyiv CityHoll")获取交易总额,并按金额对顶级付款人进行评级(必须对相同的付款人进行分组)?
2.按付款人和收款人获取交易总额(例如,从"基辅CityHoll"到"谷歌"的所有交易)
谢谢!
使用annotate
和Sum
/Count
,可以执行大量聚合查询。以下是您的示例的查询:
from django.db.models import Sum
# 1. Get total of transactions per payer, ranked by total
Transactions.objects.values('payer').annotate(total=Sum('amount'))
.order_by('-total')
# 2. Get total per payer/receiver, ranked by total
Transactions.objects.values('payer', 'receiver').annotate(total=Sum('amount'))
.order_by('-total')
因此,您将获得dict
的列表(因为它与您的模型不匹配),因此如果payer
和/或receiver
是ForeignKey,请不要忘记获取正确的属性来检索名称(或单独查询以获取其完整对象)