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_Django Orm - Fatal编程技术网

Django中过滤后通过多个关系获取对象

Django中过滤后通过多个关系获取对象,django,django-orm,Django,Django Orm,我有这些模型: class Notebook(models.Model): title = models.CharField(max_length=200) class Tag(models.Model): name = models.CharField(max_length=63) notebooks = models.ManyToManyField(Notebook, related_name='tags') 我试图找到所有有两个特定标签的笔记本(如果我能找到两个

我有这些模型:

class Notebook(models.Model):
    title = models.CharField(max_length=200)

class Tag(models.Model):
    name = models.CharField(max_length=63)
    notebooks = models.ManyToManyField(Notebook, related_name='tags')
我试图找到所有有两个特定标签的笔记本(如果我能找到两个标签,我可能会推断出查询的其余部分)

我正在使用以下命令定义两个标记的查询:

            query = Q(name__iexact='dna') | Q(name__iexact='notebook') 
Tag.objects.filter(query)
我可以通过以下方式过滤相关标签:

            query = Q(name__iexact='dna') | Q(name__iexact='notebook') 
Tag.objects.filter(query)

但我正在寻找所有有这些标签的笔记本。在SQL中,我会进行连接,但ORM方法
选择相关的
显然不适用于ManyToManyField

您可以使用相关的_名称进行筛选:

Notebook.objects.filter(Q(tags__name__iexact='dna') | Q(tags__name__iexact='notebook'))

根据该文件规定:

连续的filter()调用进一步限制了对象集,但对于多值关系,它们适用于链接到主模型的任何对象,而不一定是先前filter()调用选择的对象

下面的示例显示了查询m2m关系时链接的
filter
。因此,根据问题中列出的模型,您可以创建一个查询,然后通过标记循环,不断向查询对象添加一个
.filter(tags\u name\uu iexact=tag)

        tags = ['dna', 'notebook']
        q = Notebook.objects
        for tag in tags:
            q = q.filter(tags__name__iexact=tag)
        return q

我最初认为该方法将涉及使用reduce lamba构造一个大Q对象,但链接是有效的。

Thnaks但这是一个OR查询。我正在尝试查找所有具有所有指定标签的笔记本,例如“dna”和“笔记本”;