You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中按ItemType对item_amount字段求和?

Django按ItemType分组统计ItemAmount总和的实现方法

嘿,这事儿用Django ORM就能轻松搞定,有几种常用的实现方式,我给你一一说明:

方法一:从Items模型出发直接分组统计

这是最直接的方式,利用values()指定分组字段,再结合annotate()和聚合函数Sum来计算总和:

from django.db.models import Sum

# 按item_type(外键ID)分组,统计每个分组的item_amount总和
grouped_result = Items.objects.values('item_type').annotate(total_amount=Sum('item_amount'))

如果想直接获取ItemType的名称(而非外键ID),可以调整values()的参数,关联到ItemType的type字段:

# 按ItemType的type字段分组,同时获取类型名称和对应总和
grouped_result = Items.objects.values('item_type__type').annotate(total_amount=Sum('item_amount'))

返回的grouped_result是一个QuerySet,里面是字典对象,你可以这样遍历取值:

for item in grouped_result:
    # 以第二种写法为例,输出类似:{'item_type__type': '电子产品', 'total_amount': 2500.0}
    print(f"类型: {item['item_type__type']}, 总金额: {item['total_amount']}")

方法二:从ItemType模型出发反向统计

如果你需要同时用到ItemType的其他字段,这种方式会更方便——直接从ItemType模型出发,通过反向关联(Django自动生成的items关联名,因为你的模型是Items,所以反向名是小写的items)来统计:

from django.db.models import Sum

# 为每个ItemType实例添加total_amount属性,对应关联的items的item_amount总和
type_with_total = ItemType.objects.annotate(total_amount=Sum('items__item_amount'))

这种方式返回的是包含ItemType实例的QuerySet,每个实例都带有total_amount属性,遍历起来更直观:

for item_type in type_with_total:
    print(f"类型名称: {item_type.type}, 总金额: {item_type.total_amount}")

需要注意的是,如果某个ItemType没有关联的Items记录,total_amount会返回None,你可以根据需求做默认值处理~

内容的提问来源于stack exchange,提问作者khanals

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 09:02:34