我有以下查询:
things = Thing.objects.filter(tags__in=selected_tags).distinct()
如果 selected_tags 看起来像这样:
selected_tags = [<Tag: tag1>, <Tag: tag2>]
那么事物将包含任何具有 tag1 或 tag2 的事物。
我想要一个查询,它给我的东西有 tag1 和 tag2(甚至可能是 tag3,但不一定)。做这个的最好方式是什么?
我有以下查询:
things = Thing.objects.filter(tags__in=selected_tags).distinct()
如果 selected_tags 看起来像这样:
selected_tags = [<Tag: tag1>, <Tag: tag2>]
那么事物将包含任何具有 tag1 或 tag2 的事物。
我想要一个查询,它给我的东西有 tag1 和 tag2(甚至可能是 tag3,但不一定)。做这个的最好方式是什么?
__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)
这有点令人费解,但如果您需要动态创建查询(而不是仅仅硬编码您要搜索的每个标签),那么这是您最好的选择。