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

