2011-11-14 18 views
4

のは、私は、次のDjangoのモデルを持っているとしましょう:2つのManyToManyフィールドをDjangoクエリと交差させる方法は?

class A(models.Model): 
    keywords = models.ManyToManyField(Keyword) 

class B(models.Model): 
    keywords = models.ManyToManyField(Keyword) 

私はオブジェクトがあります。私は、Bオブジェクト内のいくつかのキーワードがAオブジェクト内のいくつかのキーワードと同じであるすべてのBオブジェクトを探したい。

このクエリを作成する正しい方法は何ですか? aAのインスタンスである場合

答えて

7

を私の正気のためには、私はそれぞれの記事とブログでAとBを交換しています。関連する名前を解析するほうがずっと簡単です。だから、私たちは持っている:

class Article(models.Model): 
    keywords = models.ManyToManyField(Keyword) 

class Blog(models.Model): 
    keywords = models.ManyToManyField(Keyword) 

これは、1つのクエリで、動作するはずです:

article = Article.objects.all()[0] 
Blog.objects.filter(keywords__in=Keyword.objects.filter(articles=article)) 

をDjangoはひとつのデータベース呼び出しを行う、Blog.objects.filter問合せにKeyword.objects.filterを結合します。

+0

この結果、複数の単一のクエリ、またはデータベースへの1つの結合クエリが発生しますか? – ModulusJoe

+1

1つのクエリのみ。 Djangoシェルの 'print Blog.objects.filter(keywords__in = Keyword.objects.filter(articles = article))。query'で確認できます。 –

+0

私は実際には、SET GLOBAL general_log = 'ON'を使用して、最後にクエリをログオンするようにしました。 しかし、.queryのトリックは非常に便利になるだろう。ありがとう – ModulusJoe

0

、そのようなことを行う必要があります。

B.objects.filter(keywords__pk__in=a.keywords.values_list('pk', flat=True)) 
+0

編集:クエリーセットが評価されているため、データベースは一度しかヒットしません。 –

関連する問題