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

Django ORM如何单查询计算关联子表qty与price乘积的总和

Django ORM 关联子表字段乘积求和实现方法

首先需要导入Django ORM对应的内置工具函数:

from django.db.models import F, Sum
# 如需处理空值默认返回0,额外导入以下两个类
from django.db.models import Coalesce, Value

基础实现方案

datas = Transaction.objects.annotate(
    total_amount=Sum(F('details__qty') * F('details__price'))
).all()

说明:

  • details__前缀对应你在ForeignKey中定义的related_name属性,用于跨表关联到子表Detail的字段
  • F()表达式会直接在数据库层面执行字段运算,不需要把数据拉取到Python层计算,性能更高
  • annotate会给每个返回的Transaction对象新增total_amount属性,存储对应子表所有qty*price的求和结果

可选优化场景

空值默认返回0

如果需要让没有关联Detail记录的Transaction的聚合结果返回0而不是NULL,可以用Coalesce指定默认值:

datas = Transaction.objects.annotate(
    total_amount=Coalesce(
        Sum(F('details__qty') * F('details__price')),
        Value(0)
    )
).all()

过滤无关联明细的记录

如果不需要返回没有子表关联的Transaction数据,可以添加过滤条件:

datas = Transaction.objects.annotate(
    total_amount=Sum(F('details__qty') * F('details__price'))
).filter(total_amount__isnull=False).all()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 22:45:10