在Django中过滤后通过ManyToMany关系获取对象

时间:2020-02-26 22:52:24

标签: 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')

并且我正在尝试查找所有带有两个特定标签的笔记本(如果可以使两个标签正常工作,我可能可以推断出查询的其余部分)

我正在使用以下两个标签定义查询:

            query = Q(name__iexact='dna') | Q(name__iexact='notebook') 

我可以使用以下方法过滤相关标签:

Tag.objects.filter(query)

但是我正在寻找所有带有这些标签的笔记本。在SQL中,我将执行JOIN操作,但是ORM方法select_related显然不适用于ManyToManyField

2 个答案:

答案 0 :(得分:1)

spanning multi-valued relationships下,文档显示:

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

随后的示例随后显示filter在查询m2m关系时被链接。因此,根据问题中列出的模型,您可以创建查询,然后遍历标记以继续向查询对象添加.filter(tags_name__iexact=tag)

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

最初,我认为该方法将涉及使用一个简化的兰巴构建一个大Q对象,但是可以进行链接。

答案 1 :(得分:0)

您可以使用related_name进行过滤:

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

tags = ['dna', 'notebook']
Notebook.objects.filter(tags__name__in=tags)