Django中对关联Payment行求和后与Fee模型amount字段比较的实现问题
Django ORM实现总支付金额低于应付金额的Fee筛选
你可以直接通过Django自带的聚合查询和字段引用功能实现需求,无需手写原生SQL,实现代码如下:
from django.db.models import Sum, F # 替换为你自己的模型导入路径 from .models import Fee unpaid_fees = Fee.objects.annotate( # 关联Payment求和,注意你的外键设置了related_name为fee_payment,所以用该字段关联 total_paid=Sum('fee_payment__amount', default=0) ).filter( # 用F表达式引用当前Fee模型的amount字段做比较 total_paid__lt=F('amount') )
代码说明
annotate方法会为每一个Fee查询结果追加一个total_paid字段,存储该Fee下所有关联支付记录的金额总和,default=0参数用于处理没有任何支付记录的Fee,默认总支付金额为0F表达式用于在查询中直接引用模型自身的字段值,这里直接将聚合得到的总支付金额和Fee的应付金额做比较- 生成的SQL逻辑和你提供的原生SQL完全一致,自动包含
GROUP BY和HAVING子句
如果需要验证生成的SQL是否符合预期,可以打印unpaid_fees.query查看完整SQL语句。
内容的提问来源于stack exchange,提问作者Yeamin Mahmud
相关产品推荐
相关产品推荐

