Django ORMでサブクエリを作成するのは簡単です(QuerySet
別のクエリの一部としてを使用するだけです)が、そのサブクエリが「親」(外部、メイン)クエリのフィールドを参照することは可能ですか?
私が達成しようとしていることの完全な例については、この動作するSQLFiddleを参照してください。私はそれを2つの質問に分けました(他の1つはここにあります)。この場合、Whole
到達しなければならない値を表すモデルがあります。いくつかPart
のは、独自の(計算された)値でそれに貢献します。まだ完了していない(つまり、Whole
個々の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
で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を使用することはできません)。