FieldError: Неподдерживаемый поиск для поля CharField или объединение по полю не разрешено на Django
Почему я получаю эту ошибку: FieldError: Unsupported lookup 'unaccent' for CharField or join on the field not permitted
?
Info
Язык: Python
Платформа: Django
База данных: PostgreSQL
Code
Вид:
def search(request):
query = request.GET.get("query")
searched = Book.objects.filter(title__unaccent__icontains=query) # Error here
return render(request, "main/search.html", {
"query": query,
"searched": searched,
})
Ожидаемый выход
Убрать акцент в запросе и найти в базе данных версию без акцента.
Описание
Я получаю ошибку FieldError: Unsupported lookup 'unaccent' for CharField or join on the field not permitted
при попытке запросить базу данных с помощью __unaccent
при использовании расширенных возможностей поиска, упомянутых в документах django.
Если unaccent
или любой другой специфический для PostgreSQL поиск, сначала
- Добавьте
django.contrib.postgres
в вашsettings.py
INSTALLED_APPS
. - Активируйте расширение поиска на PostgreSQL. Для
unaccent
нажмите здесь (в разделе "Использование"), или вы можете - Выполнить операцию миграции расширения. Для
unaccent
расширение называетсяUnaccentExtension
. Вы можете выполнить эту операцию миграции путем
$ ./manage.py makemigrations --empty your_app_name
Затем перейдите к файлу миграции, созданному в папке migrations
вашего приложения. Если вы не уверены, какой именно файл был только что создан, самым новым файлом обычно является тот, который вы создали. Чтобы быть особенно внимательным, посмотрите на вывод терминала, который появился после выполнения вышеуказанной команды. Он будет включать имя файла под заголовком Migrations for your_app_name
.
Затем в этом файле удалите содержимое и вставьте следующее:
from django.contrib.postgres.operations import UnaccentExtension
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('<your_app_name>', '<previous_migration_file>'),
]
operations = [
UnaccentExtension()
]
В приведенном выше коде замените <your_app_name>
на название вашего приложения, а previous_migration_file
на название файла миграции, предшествующего этому, не включая расширение файла .py
. Чтобы найти предыдущий файл миграции, посмотрите на номер файла миграции, в котором вы находитесь (например, в 0008_auto_20220104_1352
, 0008
- это номер файла) и вычтите 1 (например, предыдущий файл 0008_auto_20220104_1352
будет начинаться с 0007
).
После внесения изменений, python3 manage.py migrate
чтобы перенести изменения. Теперь вы можете получить доступ к расширению unaccent
.