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

Django ORM嵌套SUM计算报错 如何实现price*(inventory1+inventory2)聚合

错误原因

你写法出错的核心是在Sum聚合内部嵌套了另一层Sum聚合,既不符合price*(inventory1+inventory2)的逐行计算逻辑,也违反了Django ORM同一层级annotate不允许嵌套聚合函数的规则,会导致SQL生成异常。

正确实现代码

不需要内层的Sum,直接对单条记录的字段做运算后再整体聚合即可:

results = (
    Card.objects.values("rarity")
    .annotate(
        price=Sum(F("price") * (F("inventory1") + F("inventory2")))
    )
    .order_by()
)

兼容处理(可选)

如果运行时出现字段类型不匹配的报错,可以用ExpressionWrapper明确指定返回值的字段类型:

from django.db.models import ExpressionWrapper, DecimalField

results = (
    Card.objects.values("rarity")
    .annotate(
        price=Sum(
            ExpressionWrapper(
                F("price") * (F("inventory1") + F("inventory2")),
                output_field=DecimalField(max_digits=10, decimal_places=2)
            )
        )
    )
    .order_by()
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:12:02