小编nel*_*las的帖子

如何在 Django 中使用 Q.AND 限制多对多关系的查询

我想获取具有 2 个特定标签“tag1” AND“tag2”的所有图像。我的简化模型:

class Image(models.Model):
    title = models.CharField(max_length=100)

class Tag(models.Model):
    name = models.CharField(max_length=64, unique=True)
    images = models.ManyToManyField(Image, null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)

连接filter作品:

query = Image.objects.filter(tag__name='tag1').filter(tag__name='tag2')
Run Code Online (Sandbox Code Playgroud)

然而,我认为我可以使用 Django 中的 Q 对象来做到这一点。我正在构建一个复杂的查询,因此使用 Q 会更简单。我将所有参数添加到qobj = Q()using qobj.add(Q(tag__name='tag1'), Q.AND)。但是...以下内容什么也检索不到:

qobj = Q()
qobj.add(Q(tag__name='tag1'), Q.AND)
qobj.add(Q(tag__name='tag2'), Q.AND)
query = Image.objects.filter(qobj)
Run Code Online (Sandbox Code Playgroud)

OR在上面的代码中使用连接器时,一切都按预期工作,正确返回具有 tag1 ORtag2 的图像。

似乎在这种AND情况下,它正在寻找 app_tag_images 中具有两个标签的行,这显然不存在,因为每一行只有一个 image_id 的 tag_id 。

有没有办法用 Q 构建这个查询?

ps:如果需要更多代码细节,请告诉我。

编辑:

这是带有 Q 的查询的 que sql 查询(SELECT为了清楚起见,我清理了大部分列):

SELECT …
Run Code Online (Sandbox Code Playgroud)

python django django-queryset

5
推荐指数
1
解决办法
1717
查看次数

标签 统计

django ×1

django-queryset ×1

python ×1