gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:02:59 26 4
gpt4 key购买 nike

主要问题:
我有一个 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 方法(如下所示)排序而不是在模型级别排序,我将无法使用通用 View 。其次,使用 Python 方法进行排序会返回与 SQLite order_by 完全相同的结果:“Čapek”和“Örkény”位于“z”部分之后。

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

如何正确排序查询集?

最佳答案

感谢链接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’/’ó’之后。在默认归类表中,四个字母是相等的。现在我尝试找到一种方法来定义或查找本地化的归类表。

关于python - Django,SQLite - 带重音字母的字符串的准确排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23759464/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com