根据我在Django手册上阅读的内容,我认为exact
字段查找将执行区分大小写的搜索,但是,当我这样做时
FormZBaseElementExtraLabel.objects.filter(label__exact='his6')
我得到以下输出
<QuerySet [<FormZBaseElementExtraLabel: HIS6>]>
显然不区分大小写,并且实际上与默认的filter
或iexact
相同。
关于可能是什么问题的任何想法?
谢谢
答案 0 :(得分:1)
答案 1 :(得分:0)
尝试一下: 进行区分大小写的搜索
FormZBaseElementExtraLabel.objects.filter(**{'label__contains': 'his6'})
答案 2 :(得分:0)
感谢大家的回答。确实,我已经意识到我将MySQL(MariaDB)与排序规则utf8mb4_unicode_ci
配合使用,这解释了exact
查询查找为何不区分大小写的原因。
如所指出的,在不更改基础数据库(特别是其某些列)的排序规则的情况下,以下搜索区分大小写FormZBaseElementExtraLabel.objects.filter(label__contains = 'his6').filter(label = 'his6')
。另外,也可以使用here中所述的raw方法运行自定义查询。
答案 3 :(得分:0)
我做了一个利用BINARY expr进行MySQL字符串区分大小写的匹配:
from django.db.models.fields import Field
from django.db.models import Lookup
@Field.register_lookup
class StrExact(Lookup):
"""
MySQL string case sensitive string lookup
"""
lookup_name = 'str_exact'
def as_sql(self, compiler, connection):
lhs, lhs_params = self.process_lhs(compiler, connection)
rhs, rhs_params = self.process_rhs(compiler, connection)
params = lhs_params + rhs_params
return "%s = binary %s" % (lhs, rhs), params
用法:
FormZBaseElementExtraLabel.objects.filter(label__str_exact='his6').count()
详细了解自定义查找https://docs.djangoproject.com/en/3.0/howto/custom-lookups/