首页 > 解决方案 > Django - 查询 CharFields 忽略变音符号

问题描述

在 Django 中有没有办法过滤一些CharField/TextField使用仅包含 ASCII 字符但匹配数据库中可能包含非 ASCII 字符的记录的字符串?

例如。我想用下面的代码找到一个name设置为科隆的城市:

from django.db import models

class City(models.Model):
    name = models.CharField(max_length=30)

City.objects.filter(name__<some lookup>='koln')

标签: djangodjango-orm

解决方案


所以,我的问题的答案实际上是unaccent查找,因为我使用的是 PostgreSQL。以下是文档:https ://docs.djangoproject.com/en/2.2/ref/contrib/postgres/lookups/#unaccent

这个查找字段不能立即工作,第一个需要安装unaccent 扩展

归功于这个答案- 简单的方法是创建空迁移并使用 Django 添加非重音扩展

python manage.py makemigrations --empty <app_name>

然后在新的迁移文件中:

from django.db import migrations
from django.contrib.postgres.operations import UnaccentExtension


class Migration(migrations.Migration):

    dependencies = [
        ('app_name', '<parent_migration>'),
    ]

    operations = [
        UnaccentExtension(),
    ]

现在我可以像这样进行所需的查询:

City.objects.filter(name__unaccent__iexact='koln')

它按预期工作:)


推荐阅读