【发布时间】:2018-08-15 17:33:47
【问题描述】:
我有一个返回用户定义标签列表的查询集。在某些情况下,我想排除任何以“本地”一词开头的标签,但这似乎给我带来了问题。
以下示例在我测试其他值(例如下面的 HVAC)时有效:
queryset = queryset.exclude(tags__tag__tag_name__icontains = 'HVAC')
queryset = queryset.exclude(tags__tag__tag_name__istartswith = 'HVAC')
但是当我尝试对“Local”进行相同操作时,它会排除所有内容,而不仅仅是包含或以“Local”一词开头的值。下面的两个例子都排除了一切:
queryset = queryset.exclude(tags__tag__tag_name__icontains = 'Local')
queryset = queryset.exclude(tags__tag__tag_name__istartswith = 'Local')
作为附加说明,以下内容确实有效,但它仅排除了该确切值,我无法预测/列出所有以“Local”开头的值:
queryset = queryset.exclude(tags__tag__tag_name = 'Local 123')
我最好的猜测是“Local”是python中的保留字?关于解决此问题的任何想法或我还缺少其他什么?
【问题讨论】:
-
如果在 Local 后面加上一个空格,比如
queryset = queryset.exclude(tags__tag__tag_name__icontains = 'Local ')? -
@MattCremeens 是的,我认为这也可能有所帮助,但这并没有改变任何事情。
-
.exclude(..)的工作方式与.filter(..)不同。现在您排除所有 model 对象,这些对象中至少有一个带有'Local'的标签。 -
@WillemVanOnsem 很有趣,谢谢。似乎过滤器正在做同样的事情 - 这是你的意思吗?
queryset = queryset.filter(~Q(tags__tag__tag_name__icontains = 'Local)) -
是的,重点是存在量词的否定,是否定谓词的全称量词。
标签: python django django-queryset