如何在现有模型上激活unaccent扩展

时间:2015-07-13 11:53:55

标签: django postgresql django-models

当我尝试安装unaccent Postgres扩展程序(通过postgresql-contrib包)时,一切都按照以下方式运行:

# psql -U postgres -W -h localhost
Password for user postgres:
psql (9.3.9)
SSL connection (cipher: DHE-RSA-AES256-GCM-SHA384, bits: 256)
Type "help" for help.

postgres=# CREATE EXTENSION unaccent;
CREATE EXTENSION
postgres=# SELECT unaccent('Hélène');
 unaccent
----------
 Helene
(1 row)

然而,当我尝试使用Django 1.8时,我收到以下错误:

ProgrammingError: function unaccent(character varying) does not exist
LINE 1: ...able" WHERE ("my_table"."live" = true AND UNACCENT("...
                                                             ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

使用Postgresql 9.3和Django 1.8。

1 个答案:

答案 0 :(得分:20)

需要手动制作并应用迁移文件。

首先,创建一个空迁移:

./manage.py makemigrations myapp --empty

然后打开文件并将UnaccentExtension添加到operations

from django.contrib.postgres.operations import UnaccentExtension


class Migration(migrations.Migration):

    dependencies = [
        (<snip>)
    ]

    operations = [
        UnaccentExtension()
    ]

现在使用./manage.py migrate

应用迁移

如果您在最后一步中遇到以下错误:

django.db.utils.ProgrammingError: permission denied to create extension "unaccent"
HINT:  Must be superuser to create this extension.

...然后通过执行postgres# ALTER ROLE <user_name> SUPERUSER;及其NOSUPERUSER对应方暂时允许用户拥有超级用户权限。 pgAdminIII也可以这样做。

现在使用Django享受无人机功能:

>>> Person.objects.filter(first_name__unaccent=u"Helène")
[<Person: Michels Hélène>]