Django,SQLite - 用重音字母准确排序字符串

时间:2014-05-20 12:11:20

标签: python django sqlite

主要问题:
我有一个Python(3.4)Django(1.6)Web应用程序,使用包含作者表的SQLite(3)数据库。当我得到有序的作者名单时,一些带有重音字符的名字,如'Čapek'和'Örkény'是列表的末尾而不是(或直接在)列表的'c'和'o'部分。

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

我的第二次尝试:我发现了一个关于我的问题的旧的关闭Django票:https://code.djangoproject.com/ticket/8384它建议使用Python作为解决方法进行排序。我发现它非常不满意。首先,如果我使用Python方法排序(如下所示)而不是在模型级别排序,我就不能使用通用视图。其次使用Python方法进行排序会返回与SQLite order_by完全相同的结果:'Čapek'和'Örkény'位于“z”部分之后。

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

如何才能正确排序查询集?

2 个答案:

答案 0 :(得分:1)

感谢他在评论中写的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'/'ó'之后。在默认排序规则表中,四个字母相等。现在我尝试找到一种方法来定义或查找本地化的排序规则表。

答案 1 :(得分:0)

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

使用属性提供get / set方法可以帮助保持字段同步。