私は、私たちのいくつか(私は残念なことに)を満たすことができる答えを持っていると思います。私は両方のモデルがfoobar
アプリケーションであり、ctype関数であると仮定
SELECT *, `foobar_bar`.`show` AS `show` FROM `foobar_foo` LEFT OUTER JOIN `foobar_bar`
ON (`foobar_foo`.`id` = `foobar_bar`.`object_id` and
ctype = `foobar_bar`.`content_type_id`)
WHERE show=TRUE OR show=NULL
:私は、(すべての加入は、ユーザが宣言INNERものです)LEFT OUTERは、DjangoはサポートしていないJOINのようなものだった必要なもの
モデルFoo
のcontent_type。私は、このようなクエリを実行する方法を発見していないが、我々のような何かを行うことができます。
SELECT *, `foobar_bar`.`show` AS `show` FROM `foobar_foo` LEFT OUTER JOIN `foobar_bar`
ON (`foobar_foo`.`id` = `foobar_bar`.`object_id`
WHERE (show=TRUE OR show=NULL) AND ctype = `foobar_bar`.`content_type_id`
それは(単にオブジェクトのIDに基づか異なるCTYPEとのタプルに参加できます)排他的に満足のいくものではないのですが、それでも便利です。私はlink textで見つけたそのようなクエリを行う方法。
qs = Foo.objects.all()
qs.query.join((None, 'foobar_foo', None, None))
qs.query.join(('foobar_foo', 'foobar_bar', 'id', 'object_id'), promote=True)
foos.
qs = qs.extra(select = {'show': 'foobar_bar.show',},
where = "(show=TRUE OR show=NULL) AND ctype = `foobar_bar`.`content_type_id`")
一般query.join((,), promote=True)
を使用してLEFT QUERYは、INNERの代わりにJOINを私たちを取得しますが、我々は完全にその問題を解決するにはあまりにも少ないが、それでも便利です引数、上の唯一の1を渡すことができます:それはのようなものになるでしょう。
私はあなたの答えを見ましたが、より単純な考え方です:関連するセットをループし、関連するレコードを持つすべてのオブジェクトをリストに追加します。次に、モデルを再度ループし、リストにあるすべてのレコードをスキップします。 これは遅くなりますが、PythonとDjango ORMに完全に固執する利点があります。 –