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 поиск, сначала

  1. Добавьте django.contrib.postgres в ваш settings.py INSTALLED_APPS.
  2. Активируйте расширение поиска на PostgreSQL. Для unaccent нажмите здесь (в разделе "Использование"), или вы можете
  3. Выполнить операцию миграции расширения. Для 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.

Вернуться на верх