Django的“精确”字段查找是否执行不区分大小写的搜索?

时间:2019-11-11 12:54:24

标签: django

根据我在Django手册上阅读的内容,我认为exact字段查找将执行区分大小写的搜索,但是,当我这样做时

FormZBaseElementExtraLabel.objects.filter(label__exact='his6')

我得到以下输出

<QuerySet [<FormZBaseElementExtraLabel: HIS6>]>

显然不区分大小写,并且实际上与默认的filteriexact相同。

关于可能是什么问题的任何想法?

谢谢

4 个答案:

答案 0 :(得分:1)

实际上__exact是精确匹配

并且__iexact用于不区分大小写的完全匹配

有关更多信息,您可以访问django文档queryset页面

答案 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/