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

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,默认总支付金额为0
  • F表达式用于在查询中直接引用模型自身的字段值,这里直接将聚合得到的总支付金额和Fee的应付金额做比较
  • 生成的SQL逻辑和你提供的原生SQL完全一致,自动包含GROUP BY和HAVING子句

如果需要验证生成的SQL是否符合预期,可以打印unpaid_fees.query查看完整SQL语句。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:00:03