我开始调查为什么我的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')
EDIT1: 显然我不是唯一一个要求这样做的人: https://groups.google.com/forum/#!msg/django-developers/0iESVnawNAY/JefMfAm7nQMJ
艾伦
答案 0 :(得分:5)
由于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
子句中使用它,则可以在Func()
中使用annotate()
。
答案 1 :(得分:2)
好吧。现在看来,原始查询是唯一的方法。
但是有一个django ticket开放,希望很快就会被关闭/解决。