Django, SQLite - 带有重音字母的字符串准确排序

2024-09-30 08:38:07 发布

您现在位置:Python中文网/ 问答频道 /正文

主要问题:
我有一个Python(3.4)Django(1.6)web应用程序,它使用一个包含作者表的SQLite(3)数据库。当我得到作者的有序列表时,一些带有重音符号的名字,比如“chapek”和“eurkény”是列表的末尾,而不是在列表的“c”和“o”部分(或紧跟其后)。

我的第一次尝试:
SQLite可以接受排序规则定义。我搜索了一个用于正确排序UTF-8字符串的命令,例如Android(Accented Search in sqlite (android))中的本地化和Unicode排序规则,但没有找到。

我的第二次尝试:
我发现了一个关于我的问题的老的关闭的Django问题:https://code.djangoproject.com/ticket/8384它建议使用Python进行排序。我觉得很不满意。首先,如果我用Python方法排序(如下所示),而不是在模型级别排序,我就不能使用泛型视图。第二个使用Python方法排序的结果与SQLite order_by的结果相同:“chapek”和“eurkény”放在“z”部分之后。

author_list = sorted(Author.objects.all(), key=lambda x: (x.lastname, x.firstname))

如何才能正确地订购queryset?在


Tags: django方法web数据库应用程序列表sqlite排序
2条回答

多亏了他的评论中的链接CL,我成功地克服了我回复的困难。我回答我的问题是为了分享一段有效的代码,因为使用Pyuca对查询集进行排序似乎是一种罕见且没有文档记录的情况。在

# import section
from pyuca import Collator

# Calling Collator() takes some seconds so you should create it as reusable variable.
c = Collator()

# ...

# main part:
author_list = sorted(Author.objects.all(), key=lambda x: (c.sort_key(x.lastname), c.sort_key(x.firstname)))

关键是将sort_key方法与要排序的属性作为参数一起使用。可以按示例中的多个属性进行排序。在

最后一句话:在我的语言(匈牙利语)中,我们使用四种不同口音的拉丁字母“o”:“o”,“o”,“ö”,“ő”。‘o’和‘ó’在排序上是相等的,而‘ö’和‘ő’也是相等的,而‘ö’/‘ő’在‘o’/‘ó’之后。在默认的排序规则表中,四个字母相等。现在,我试图找到一种定义或查找本地化排序表的方法。在

您可以在表中创建一个新字段,用unidecode的结果填充它,然后根据它排序。在

使用属性提供get/set方法有助于保持字段的同步。在

相关问题 更多 >

    热门问题