【问题标题】:Django __exact queryset filter - case sensitivity not working as expectedDjango __exact 查询集过滤器 - 区分大小写不能按预期工作
【发布时间】:2020-11-09 12:11:42
【问题描述】:

我正在尝试过滤大小写应该敏感的 Django 查询集,尽管我没有从“__exact”过滤器中得到我期望的结果,我认为它是区分大小写的: https://docs.djangoproject.com/en/3.0/ref/models/querysets/

我的代码如下所示:

lower_case_test = MyObject.objects.filter(name__exact="d")
for item in lower_case_test:
    print("item.name: ", item.name)

我在“MyObject”模型中有 2 个,一个名为“d”,一个名为“D”。

以上代码的输出为:

(u'item: ', u'D') (u'item: ', u'd')

谁能提出这里可能存在的问题? 提前致谢。

【问题讨论】:

  • 尝试将 all() 添加到您的查询lower_case_test = MyObject.objects.all().filter(name_exact="d")
  • 嗨@ChristopherHolder - 感谢您的建议。刚试过,没区别。
  • 你用的是什么数据库?
  • @ArakkalAbu MySQL

标签: django django-queryset case-sensitive


【解决方案1】:

我猜你在过滤器中打错字了,因为它应该是nameexact 之间的两个下划线。

某些数据库无法对字符串进行完全匹配,并且会以任何小写/大写形式回答您的结果。

你的数据库和数据库配置是什么?

更多信息django note

您可以通过在 django shell (./manage.py shell) 中查询并询问 sql 语句来找出答案:

from logging import getLogger, DEBUG, StreamHandler
l = getLogger('django.db.backends')
l.setLevel(DEBUG)
# l.addHandler(StreamHandler())  # shouldn’t be necessary
list(MyObject.objects.filter(name__exact="d"))

有了这个,你可以尝试直接在你的数据库中播放它并更好地了解发生了什么(你可以使用./manage.py dbshell

【讨论】:

  • 嗨,感谢您指出错字,我已经更新了我的问题(这只是 SO 上的错字,而不是代码中的错字)。我正在使用 'ENGINE': 'django.db.backends.mysql' 作为我的数据库。使用标准 MySQL 配置
【解决方案2】:

如果您使用的是 SQLLite DB,__exact 和 __iexact 查询不区分大小写。

要正确获取功能,请将 MySql 数据库的排序规则更改为 latin1_swedish_cs 或 utf8_bin 以进行区分大小写的比较。

查看链接以获取详细解决方案。 https://code.djangoproject.com/ticket/2170

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 2013-08-07
    • 2013-07-01
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    相关资源
    最近更新 更多