【问题标题】:Case insensitive search doesn't work on Django (Postgres) with non-latin characters不区分大小写的搜索不适用于具有非拉丁字符的 Django (Postgres)
【发布时间】:2021-09-22 10:13:02
【问题描述】:

PostgreSQL 13.4
Django 3.2
macOS 11.2

我尝试实现一个搜索功能,通过“名称”字段查找模型实例。

models.py

    class LatestConfiguration(models.Model):

        # Primary key
        name = models.CharField(verbose_name='Имя',
                                max_length=150,
                                unique=True,
                                primary_key=True)

数据库编码为UTF8:

➜  ~ psql <DB_NAME> -c 'SHOW SERVER_ENCODING'
 server_encoding 
-----------------
 UTF8
(1 row)

数据库包含记录,例如:

Бухгалтерия для Казахстана, редакция 3.0

我尝试搜索这样的模型实例:

 LatestConfiguration.objects.filter(name__icontains='Бух')

输出没问题:

>>> LatestConfiguration.objects.filter(name__icontains='Бух')
<QuerySet [Бухгалтерия для Казахстана, редакция 3.0]>

我将“Бух”中的第一个字母小写为“бух”并重复搜索

>>> LatestConfiguration.objects.filter(name__icontains='бух')
<QuerySet []>

所以现在我得到一个空的查询集,但我不应该

我也尝试过 Q-objects:

Q(name__istartswith='бух')

但没有得到任何结果

尝试使用postgres全文搜索 通过添加:

    'django.contrib.postgres',

到 settings.py 中的 INSTALLED_APPS

并以这种方式重复搜索:

>>> LatestConfiguration.objects.filter(name__icontains='бух')
<QuerySet []>

其他人也有同样的错误吗?

【问题讨论】:

  • 你的数据库的collat​​ion是什么?
  • 显示 lc_collat​​e; C
  • 显示 lc_ctype; C
  • 似乎我需要使用 en_US.UTF8 排序规则重新创建我的数据库集群:(

标签: python django postgresql


【解决方案1】:

首先我查看了所有系统语言环境 通过执行

locale -a

我没有必需的语言环境 ru_RU.UTF-8 所以我做到了

locale-gen ru_RU.UTF-8

重新启动 postgres 以使其看到新的语言环境

service postgresql restart

以管理员身份登录

sudo -u postgres psql

并创建了一个这样的新数据库

CREATE DATABASE "<Mydatabasename>" WITH ENCODING 'UTF8' LC_COLLATE='ru_RU.UTF-8' LC_CTYPE='ru_RU.UTF-8' TEMPLATE=template0;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    相关资源
    最近更新 更多