Django自定义字段-自动添加COLLATE到查询

发布于 2024-09-07 22:19:21 字数 497 浏览 1 评论 0原文

我正在尝试创建一个自定义字段,它会自动将 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')

即使查询(打印 result.query)有效且匹配,也找不到任何内容几行。我做错了什么吗?

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

I'm trying to create a custom field which would automatically add COLLATE information into the WHERE part of SQL query:

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'

when I perform a query like this:

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

then nothing is found, even though the query (print result.query) is valid and matches several rows. Am I doing something wrong?

The reason why I'm adding the collation iformation is that I want perform queries on those fields and ignore any diacritics.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

韵柒 2024-09-14 22:19:21

您是否使用过 MySQL 1.2.1p2?来自 Django 文档

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

Are you using MySQL 1.2.1p2 by any chance? From the Django documentation

If you're using MySQLdb 1.2.1p2, Django's standard CharField class
will return unicode strings even with utf8_bin collation. However,
TextField fields will be returned as an array.array instance (from
Python's standard array module). There isn't a lot Django can do about
that, since, again, the information needed to make the necessary
conversions isn't available when the data is read in from the
database. This problem was fixed in MySQLdb 1.2.2, so if you want to
use TextField with utf8_bin collation, upgrading to version 1.2.2 and
then dealing with the bytestrings (which shouldn't be too difficult)
as described above is the recommended solution.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文