3

我正在尝试创建一个自定义字段,该字段会自动将 COLLATE 信息添加到 SQL 查询的 WHERE 部分:

class IgnoreDiacriticsField(models.TextField):

    def get_prep_lookup(self, lookup_type, value):
        if lookup_type == 'exact':
            return ' "' + self.get_prep_value(value) + '" COLLATE utf8_general_ci'

当我执行这样的查询时:

result = ModelClass.objects.filter(field='value')

然后什么也找不到,即使查询 (print result.query) 是有效的并且匹配了几行。难道我做错了什么?

我添加排序规则信息的原因是我想对这些字段执行查询并忽略任何变音符号。

4

1 回答 1

0

您是否有机会使用 MySQL 1.2.1p2?来自 Django 文档

如果您使用的是 MySQLdb 1.2.1p2,即使使用 utf8_bin 排序规则,Django 的标准 CharField 类也会返回 unicode 字符串。但是,TextField 字段将作为 array.array 实例返回(来自 Python 的标准数组模块)。Django 对此无能为力,因为当从数据库中读取数据时,进行必要转换所需的信息不可用。此问题已在 MySQLdb 1.2.2 中修复,因此如果您想使用带有 utf8_bin 排序规则的 TextField,则建议升级到 1.2.2 版本,然后如上所述处理字节字符串(这应该不会太难)是推荐的解决方案。

于 2011-12-24T09:34:12.300 回答