Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django中查找Min(Sum(带注释的列))_Python_Django_Orm_Psql - Fatal编程技术网

Python 如何在Django中查找Min(Sum(带注释的列))

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"))

我有四个表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")) 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'
是的,我后来发现了。谢谢你的意见。