2010-12-20 22 views
1

関連するものの空のセットを持つすべてのオブジェクトを取得:私は2つのモデル持って

class Content(models.Model): 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField(db_index=True) 
    content_object = generic.GenericForeignKey() 
    show = models.BooleanField(default=False) 

class Foo(models.Model): 
    rel = generic.GenericRelation(Content) 

をそして私はshow==Trueを持っているか、そのdoesnの(一つだけ存在することになる)関連コンテンツオブジェクトのすべてのFooのメソッドを取得したいです関連するオブジェクトはまったくありません。何かが好きです:

もちろん、djangoにはhasnoneのようなものはありません。

私はこれを達成できる他の方法はありますか(残念ながら、集計は一般的な関係では機能せず、アイテム数もカウントできません)。

+0

私はあなたの答えを見ましたが、より単純な考え方です:関連するセットをループし、関連するレコードを持つすべてのオブジェクトをリストに追加します。次に、モデルを再度ループし、リストにあるすべてのレコードをスキップします。 これは遅くなりますが、PythonとDjango ORMに完全に固執する利点があります。 –

答えて

1

私は、私たちのいくつか(私は残念なことに)を満たすことができる答えを持っていると思います。私は両方のモデルが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を渡すことができます:それはのようなものになるでしょう。

関連する問題