Поиск без учета регистра не работает на Django (Postgres) с нелатинскими символами
PostgreSQL 13.4
Django 3.2
MacOS 11.2
Я пытаюсь реализовать функцию поиска экземпляра модели по полю "name".
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-объекты:
Q(name__istartswith='бух')
но не получил никаких результатов
Попробовал использовать полнотекстовый поиск postgres добавив:
'django.contrib.postgres',
к INSTALLED_APPS в settings.py
и повторить поиск таким образом:
>>> LatestConfiguration.objects.filter(name__icontains='бух')
<QuerySet []>
Кто-нибудь еще получил такую же ошибку?
В первую очередь я просмотрел все системные локали выполнив
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;