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

