我有以下查询:
things = Thing.objects.filter(tags__in=selected_tags).distinct()
如果selected_tags如下所示:
selected_tags = [<Tag: tag1>, <Tag: tag2>]
然后东西将包含任何具有tag1或tag2的东西。
我想要一个查询,它给我带有tag1 AND tag2的东西(甚至可能是tag3,但不一定)。这样做的最佳方式是什么?
答案 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)
它有点紊乱,但是如果你需要动态创建查询(而不是只是硬编码你正在搜索的每个标签),那么这是你最好的选择。