如何解决Django __精确查询集过滤器-区分大小写无法按预期工作
我尝试过滤区分大小写的Django queryset,尽管我没有从“ __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')
有人可以在这里提出问题吗? 预先感谢。
解决方法
我认为您在过滤器中输入了错字,因为它应该是name
和exact
之间的两个下划线。
某些数据库无法对字符串进行完全匹配,并且会以小写/大写形式回答您的结果。
您的数据库和数据库配置是什么?
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
)
如果您使用的是SQLLite数据库,则__exact和__iexact查询不区分大小写。
要正确使用功能,请将MySql数据库的排序规则更改为latin1_swedish_cs或utf8_bin以进行区分大小写的比较。
检查链接以获取详细的解决方案。 https://code.djangoproject.com/ticket/2170
,让我们考虑您的模型MyObject
,它有一个字段name
您在这里所做的第一件事是输入错误。查找类型应以__符号(双下划线)开头
因此您的查询应类似于name__exact
,让我们考虑一下数据库中存在一个名称为'D'的元素,另一个名称为'd'的元素
因此,我们有两种查找类型:exact和iexact。
print(MyObject.objects.filter(name__iexact='D').values_list('name',flat=True))
将给出输出 D,d
print(MyObject.objects.filter(name__exact='D').values_list('name',flat=True))
将给出输出 D
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。