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

Django中按支付类型分组汇总Klient的各类支付金额

解决方法

使用Django的Case和When表达式结合Sum进行条件聚合,就能在单个查询中为每个Klient计算两种支付类型的总和,避免生成多行数据。

示例代码

from django.db.models import Sum, Case, When, DecimalField

# 假设你的Platba模型中amount字段是DecimalField,根据实际类型调整output_field
klients = Klient.objects.annotate(
    payments_p=Sum(
        Case(
            When(payments__type='PAYMENT', then='payments__amount'),
            default=0,
            output_field=DecimalField()
        )
    ),
    payments_g=Sum(
        Case(
            When(payments__type='GIFT', then='payments__amount'),
            default=0,
            output_field=DecimalField()
        )
    )
)

使用说明

  • 每个Klient实例现在可以直接通过k.payments_p获取PAYMENT类型的总金额,k.payments_g获取GIFT类型的总金额。
  • 如果某个Klient没有对应类型的支付记录,对应字段会返回0而非None,这是通过default=0实现的。
  • output_field需要与Platba模型中amount字段的类型一致(比如IntegerField或DecimalField),确保聚合结果类型正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 13:33:13