【问题标题】:Django QuerySet Lookup Fails When Testing for Value "Local"测试值“本地”时,Django QuerySet 查找失败
【发布时间】: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


【解决方案1】:

我不知道这是否是处理这个问题的正确方法,但由于每个@WillemVanOnsem 似乎我排除了所有至少有一个带有“Local”标签的模型对象(当使用据我所知,排除和过滤),相反,我最终创建了一个新列表,其中包含不包含“本地”的所有值并返回该列表而不是原始查询集。

newQueryset = list()

for item in list(queryset):
    if not 'local' in str(item['tags__tag__tag_name']).lower():
        newQueryset.append(item)

return newQueryset

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-11
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    相关资源
    最近更新 更多