【问题标题】:Django queryset returns nothing for character 'i' in CharFieldDjango 查询集在 CharField 中为字符“i”返回任何内容
【发布时间】:2019-05-07 00:01:21
【问题描述】:

我正在尝试编写搜索视图以通过在 sqlite 表的 CharField 中使用 icontains 进行过滤来查找记录。但是有些记录以 'İ' 开头,当用户使用 'i' 而不是 'İ' 提交搜索表单时,查询集什么也不返回。

如果记录以“i”开头,则视图运行正确。

我还使用 LIKE 对同一个表运行 SQL 查询,但查询没有返回任何结果。

Django 2.0 Sqlite 3

编辑 1: icontains 不区分大小写,但如果单词有 'i' 字符,它会测试 'I',但我需要它来测试 'İ'。此外,它不会测试您是否为“I”键入“ı”。

我改变了我的观点并为“i”添加了这个代码 - “İ”并且它有效。但是这个问题必须有其他解决方案,而不是这种解决方法。

if query.startswith('i'):
        text = query[:0] + 'İ' + query[1:]

【问题讨论】:

    标签: django sqlite django-queryset django-2.0


    【解决方案1】:

    您可以通过 unidecode() 将重音字符转换为 ASCII

    import unidecode
    accented_string = 'İ'
    unaccented_string = unidecode.unidecode(accented_string)
    YourClass.objects.get(text__icontains=unaccented_string)
    

    【讨论】:

    • 以“İ”开头的单词没有问题。如果用户键入 'i' 而不是 'İ',则使用 icontains 进行过滤不会返回任何内容。示例:word is 'İnc' 用户输入 'inc' 并且没有搜索结果。
    猜你喜欢
    • 1970-01-01
    • 2012-04-14
    • 2021-02-19
    • 2021-05-27
    • 1970-01-01
    • 2021-04-24
    • 2013-09-10
    相关资源
    最近更新 更多