如何在Django模型中按用户分组对amount字段变量求和
Django ORM按外键分组求和实现方法
aggregate方法仅用于返回全局聚合结果,要实现按用户分组统计金额总和,需要使用values() + annotate()的分组聚合组合方案。
具体实现步骤
- 首先导入聚合函数Sum
from django.db.models import Sum
- 执行分组聚合查询
# 按用户分组,统计每个用户的amount总和 grouped_data = Test.objects.values('name__username').annotate(total=Sum('amount'))
这里values('name__username')指定按用户名字段分组,因为name是关联到auth.User的外键,所以通过双下划线__跨表取用户名字段。
- 转换为目标元组格式
testlist = tuple((item['name__username'], item['total']) for item in grouped_data)
执行后得到的结果就是你需要的(("John", 30), ("Eric", 70))格式。
补充注意点
- 你的原始模型定义存在笔误:
models.models.ForeignKey多写了一层models,正确写法为models.ForeignKey('auth.User'),注意Django内置User模型首字母大写。 - 示例中创建模型实例的写法仅作数据示意,实际开发中外键字段需要传入User实例而非用户名字符串,正确写法参考:
john = User.objects.get(username="John") test1 = Test(name=john, amount=10)
- 若你的模型Meta中配置了默认排序字段,建议在查询末尾添加
.order_by()清空排序规则,避免排序字段干扰分组逻辑。
内容的提问来源于stack exchange,提问作者Sander
相关产品推荐
相关产品推荐

