-1

我有以下查询:

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

如果 selected_tags 看起来像这样:

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

那么事物将包含任何具有 tag1 或 tag2 的事物。

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

4

1 回答 1

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)

这有点令人费解,但如果您需要动态创建查询(而不是仅仅硬编码您要搜索的每个标签),那么这是您最好的选择。

于 2012-07-06T22:09:11.817 回答