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
相关产品推荐
相关产品推荐

