Django中如何使用Aggregate Sum按name字段对同名称对象求和
实现按name字段分组求和的方案
直接用Django ORM的values() + annotate()组合即可实现需求,无需单独循环每个对象聚合,具体实现如下:
前置依赖导入
from django.db.models import Sum
核心分组求和代码
如果你操作的是Cart模型的QuerySet,直接使用以下语句:
# 指定按name字段分组,对同组内的amount字段求和 grouped_result = Cart.objects.values("name").annotate(amount=Sum("amount")).order_by()
如果你的数据源是UserProduct表,调整对应模型名即可:
grouped_result = UserProduct.objects.values("name").annotate(amount=Sum("amount")).order_by()
代码逻辑说明
values("name")作用是指定分组依据,所有name字段值相同的记录会被归为同一组annotate(amount=Sum("amount"))作用是对每个分组的amount字段做求和运算,结果赋值给amount键- 末尾的空
order_by()用于清除模型默认的排序规则,避免非分组字段的排序逻辑干扰分组结果
转换为Cart_object实例
如果你需要得到标准Cart_object实例而非字典格式,遍历结果构造即可:
cart_objects = [Cart(name=item["name"], amount=item["amount"]) for item in grouped_result]
最终cart_objects的输出格式和要求完全一致:
<QuerySet [<Cart_object: {name: 'Apple', amount: 10}>, <Cart_object: {name: 'Bananas', amount: 30}>]>
内容的提问来源于stack exchange,提问作者I.Z.
相关产品推荐
相关产品推荐

