FieldError: Unsupported lookup for CharField or join on the field not permitted on Django

FieldError: Unsupported lookup for CharField or join on the field not permitted on Django

为什么我会收到此错误:FieldError: Unsupported lookup 'unaccent' for CharField or join on the field not permitted

信息

语言:Python
平台:Django
数据库:PostgreSQL

代码

查看:

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,
    })

预期输出

取消重音查询并在数据库中搜索未重音版本。

描述

我在使用 django docs 中提到的高级搜索功能时尝试使用 __unaccent 查询数据库时收到错误 FieldError: Unsupported lookup 'unaccent' for CharField or join on the field not permitted

如果 unaccent 或任何其他 PostgreSQL 特定查找,首先

  1. django.contrib.postgres 添加到您的 settings.py INSTALLED_APPS
  2. 在 PostgreSQL 上激活查找扩展。 For unaccent, click here(在“用法”下),或者您可以
  3. 执行扩展的迁移操作。对于 unaccent,扩展名为 UnaccentExtension。您可以通过
  4. 进行此迁移操作
$ ./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 扩展。