我开始调查为什么我的 Django Model.objects.filter(condition = variable).order_by(textcolumn) 查询没有以正确的顺序生成对象。发现是数据库(Postgresql)的问题。
在我之前的问题 (Postgresql sorting language specific characters (collation)) 中,我想通了(在 zero323 的帮助下,它实际上开始工作了)我可以像这样为每个数据库查询指定排序规则:
SELECT nimi COLLATE "et_EE" FROM test ORDER BY nimi ASC;
但据我所知,order_by 只接受字段名称作为参数。
我想知道,是否有可能以某种方式扩展该功能以包括排序规则参数?是否可以使用 mixins 或诸如此类的东西以某种方式破解它?或者功能请求是目前执行此操作的唯一方法吗?
我希望它能像这样工作:
Model.objects.filter(condition = variable).order_by(*fieldnames, collation = 'et_EE')
编辑1: 显然我不是唯一一个要求这个的人: https://groups.google.com/forum/#!msg/django-developers/0iESVnawNAY/JefMfAm7nQMJ
艾伦
最佳答案
正如@olau 在评论中提到的那样,自 Django 3.2 Collate 以来实用程序可用。对于较旧的 Django 版本,请参阅以下代码示例下方的原始信息:
# Starting with Django 3.2:
Test.objects.order_by(Collate('nimi', 'et_EE'))
因为 Django 1.8 order_by()
不仅接受字段名称 but also query expressions .
在another answer我举例说明了如何覆盖列的默认排序规则。这里有用的查询表达式是Func() ,您可以对其进行子类化或直接使用:
nimi_et = Func(
'nimi',
function='et_EE',
template='(%(expressions)s) COLLATE "%(function)s"')
Test.objects.order_by(nimi_et.asc())
但是,请注意生成的 SQL 更像是:
SELECT nimi FROM test ORDER BY nimi COLLATE "et_EE" ASC;
也就是说,排序规则在 ORDER BY
子句中被覆盖,而不是在 SELECT
子句中。但是,如果您需要在 WHERE
子句中使用它,则可以在 annotate()
中使用 Func()
。
关于django - 查询集排序 : Specifying column collation for django ORM query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18935712/