2011-11-14 44 views
4

比方說,我有以下Django模型:如何用Django Query交叉兩個ManyToMany字段?

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

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

我有一個對象。我想查找所有B對象,其中B對象中的某個關鍵字與A對象中的某個關鍵字相同。

什麼是寫這個查詢的正確方法?

回答

7

對於我的理智,我與文章和博客分別代替A和B。它使解析相關名稱變得容易很多。因此,我們有:

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

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

這應該工作,在一個查詢:

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

Django會在Keyword.objects.filter合併到Blog.objects.filter查詢,使得只有一個數據庫調用。

+0

這是否會導致多個單個查詢或單個連接的數據庫查詢? – ModulusJoe

+1

只有一個查詢。您可以在Django shell中使用'print Blog.objects.filter(keywords__in = Keyword.objects.filter(articles = article))。query'進行確認。 –

+0

我實際上開啓了查詢日誌,最後使用SET GLOBAL general_log ='ON'; 但是.query技巧將會非常有用。謝謝 – ModulusJoe

0

如果aA一個實例,這樣的事情應該做的:

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

編輯:由於查詢集_lazily_評估數據庫將只命中一次。 –

相關問題