如何使用Django Query交叉两个ManyToMany字段?

时间:2011-11-14 23:00:17

标签: django join

假设我有以下Django模型:

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

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

我有一个A对象。我想找到所有B对象,其中B对象中的某些关键字与A对象中的某个关键字相同。

编写此查询的正确方法是什么?

2 个答案:

答案 0 :(得分: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查询中,只进行一次数据库调用。

答案 1 :(得分:0)

如果aA的实例,那么应该这样做:

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