我开始调查为什么我的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或诸如此类的方式破解它?或者feature request是目前唯一的方法吗?
我希望它能像这样工作:
Model.objects.filter(condition = variable).order_by(*fieldnames, collation = 'et_EE')
型
编辑1:显然我不是唯一一个问这个:https://groups.google.com/forum/#!msg/django-developers/0 iESVnawNAY/JefMfAm 7 nQMJ
艾伦
3条答案
按热度按时间5n0oy7gb1#
正如@olau在评论中提到的,自从Django 3.2 Collate实用程序可用以来。对于旧版本的Django,请参阅以下代码示例下面的原始信息:
字符串
由于Django 1.8
order_by()
不仅接受字段名,还接受查询表达式。在another answer中,我给出了一个如何覆盖列的默认排序规则的例子。这里有用的查询表达式是Func(),你可以子类化或直接使用它:
型
然而,请注意,结果SQL将更像是:
型
也就是说,排序规则在
ORDER BY
子句中而不是在SELECT
子句中被覆盖。但是,如果您需要在WHERE
子句中使用它,则可以在annotate()
中使用Func()
。2lpgd9682#
好吧。看来现在只有生食了。
但是django ticket是开放的,希望很快会被关闭/解决。
7eumitmz3#
对于我的作品:
字符串
用英语-“C”
在PostgreSQL的上下文中,COLLATE“C”表示“default”或“binary sorting”。这意味着字符串是逐字节比较的,而不考虑区域设置和排序规则。在“C”区域设置中,比较发生在最低级别,这在字符串内的字节顺序很重要的情况下很有用,例如比较二进制数据时。