在 Django ORM 中创建子查询很简单(只需将 aQuerySet
作为另一个查询的一部分),但是该子查询是否可以引用“父”(外部,主)查询中的字段?
有关我要实现的目标的完整示例,请参阅此工作SQL Fiddle。我把它分解成两个问题(另一个在这里)。在这种情况下,我有一个模型Whole
表示必须达到的值。几个Part
s 以自己的(计算的)值对其做出贡献。我想检索所有尚未完成的sWhole
(即不同于单个值的总和)。total_value
select w.*
from whole w
where w.total_value != (
select sum(value expression)
from part p
where p.whole_id = w.id
group by p.whole_id
);
我不知道如何(或者甚至可能)使用 Django ORM 来做到这一点。我已经看到了许多 使用子查询的示例__in
(并且可以通过print qs.query
结果确实作为单个查询运行来确认),但前提是两个查询彼此独立。在这里,子查询受父查询 ( w.id
) 中的字段约束。我想过使用F()
, Q()
, 甚至extra
, 但不知道该怎么做...
这是一个 SSCCE,如果有人想尝试一下:下载或浏览。它具有与上面链接的SQL 小提琴相同的模型和数据。
更新:对于我的特殊情况,我发现不需要做子查询,我可以使用group by
and having
(正如这个 SQL Fiddle所示):
q = Q(part__isnull=True) | ~Q(partial=F('total_value'))
qs = Whole.objects.annotate(partial=Sum(...)).filter(q).distinct()
# And if total_value can be zero:
qs = qs.exclude(part__isnull=True, total_value=0)
不过,子查询的一般情况仍未解决(没有使用一些原始 SQL,如下面的回答所示)。