我有以下模型:
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
答案 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)