Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Django查询使两个多字段相交?_Django_Join - Fatal编程技术网

如何使用Django查询使两个多字段相交?

如何使用Django查询使两个多字段相交?,django,join,Django,Join,假设我有以下Django模型: class A(models.Model): keywords = models.ManyToManyField(Keyword) class B(models.Model): keywords = models.ManyToManyField(Keyword) 我有一个目标。我想找到所有B对象,其中B对象中的某个关键字与A对象中的某个关键字相同 编写此查询的正确方法是什么?如果a是a的一个实例,类似这样的操作应该可以: B.objects.f

假设我有以下Django模型:

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

class B(models.Model):
    keywords = models.ManyToManyField(Keyword)
我有一个目标。我想找到所有B对象,其中B对象中的某个关键字与A对象中的某个关键字相同


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

如果
a
a
的一个实例,类似这样的操作应该可以:

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

为了我的理智,我分别用文章和博客取代了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将把
关键字.objects.filter
组合到
Blog.objects.filter
query中,只进行一次数据库调用。

EDIT:由于查询集是延迟计算的,数据库只会被点击一次。这会导致对数据库的多个查询还是一个联合查询?仅一个查询。您可以在Django shell中使用
print Blog.objects.filter(keywords\u in=Keyword.objects.filter(articles=article)).query进行确认。实际上,我最终打开了查询日志,使用SET GLOBAL general\u log='on';但是.query技巧将非常有用。谢谢