Queryset排序:为django ORM查询指定列排序规则

时间:2013-09-21 17:51:30

标签: django postgresql django-queryset

我开始调查为什么我的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

艾伦

2 个答案:

答案 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开放,希望很快就会被关闭/解决。