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”和“笔记本”;