Django ManyToMany Queryset AND而不是OR

时间:2012-07-06 21:27:00

标签: django

我有以下查询:

things = Thing.objects.filter(tags__in=selected_tags).distinct()

如果selected_tags如下所示:

selected_tags = [<Tag: tag1>, <Tag: tag2>]

然后东西将包含任何具有tag1或tag2的东西。

我想要一个查询,它给我带有tag1 AND tag2的东西(甚至可能是tag3,但不一定)。这样做的最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

__in本质上是基于OR的。它实际上是说拉出任何一个有这些标签的行。要创建基于AND的查询,您需要单独过滤每个标记:

Thing.objects.filter(tags=tag1, tags=tag2, ...)

这显然不太理想,不幸的是,在这种情况下你甚至无法使用扩展词典,因为所有的键都是相同的。因此,您唯一的选择是使用Q

from django.db.models import Q

query = None
for tag in tags:
    if query is None:
        query = Q(tags=tag)
    else:
        query &= Q(tags=tag)

things = Thing.objects.filter(query)

它有点紊乱,但是如果你需要动态创建查询(而不是只是硬编码你正在搜索的每个标签),那么这是你最好的选择。