Python 如何在Django中查找Min(Sum(带注释的列))
我有四个表A、B、C和D。每个表都通过id列以A->B->C->D的方式关联。 例如,A.id=B.A_id,B.id=C.B_id和C.id=D.C_id 我正在努力实现这样的目标Python 如何在Django中查找Min(Sum(带注释的列)),python,django,orm,psql,Python,Django,Orm,Psql,我有四个表A、B、C和D。每个表都通过id列以A->B->C->D的方式关联。 例如,A.id=B.A_id,B.id=C.B_id和C.id=D.C_id 我正在努力实现这样的目标 SELECT x.id, min(x.total) as mintotal FROM (SELECT "A"."id", SUM(("D"."amount" * "D"."quantity"))
SELECT x.id, min(x.total) as mintotal FROM (SELECT "A"."id",
SUM(("D"."amount" * "D"."quantity")) AS "total", "C"."id" AS "qid"
FROM "A" LEFT OUTER JOIN "B" ON ("A"."id" = "B"."a_id") LEFT OUTER
JOIN "C" ON ("B"."id" = "C"."c_id") LEFT OUTER JOIN "D" ON ("C"."id"
= "D"."c_id") GROUP BY "A"."id", "C"."id") as x group by x.id ORDER BY mintotal ASC
我的等效django代码
query1 = (
A.objects.all().annotate(
qid=models.F('b__c__id'),
total=Sum(models.ExpressionWrapper(
models.F('b__c__d__amount')*models.F('b__c__d__quantity'),
output_field=models.DecimalField()
))
).order_by('total')
)
它提供了内部查询输出,但是当我再次尝试选择id和Mintotal时,它会抛出错误-
FieldError:无法计算最小值'total':'total'是聚合
我是Django新手,我不确定如何使用子查询或exists来获得这个结果。任何帮助都将不胜感激看起来这个SQL与您想要的是等价的 选择 A.id, 选择 总金额*总数量 从…起 D 参加 C上的C.id=D.C\U id 参加 B在B.id上=C.B_id 哪里 B.a_id=a.id 按C.id分组 按金额*数量ASC排序的订单 限制1 总共 从…起 A. 这可以使用Django的子查询来完成 从django.db.models导入子查询,OuterRef,F subquery=SubqueryD.objects.values\uu id .annotatetotal=SumF“金额”*F“数量” .filterc\uuuu b\uuu a\uuuu id=OuterRef'id' .按“总计”排序 .值“总计”[:1] query1=A.objects.annotationMinTotal=子查询 如果您真的只需要A.id和mintotal列: query1=A.objects.annotatemintotal=subquery.values'id','mintotal'
是的,我后来发现了。谢谢你的意见。