4

我开始调查为什么我的 Django Model.objects.filter(condition = variable).order_by(textcolumn) 查询不能以正确的顺序生成对象。并发现这是数据库(Postgresql)问题。

在我之前的问题(Postgresql 排序语言特定字符(排序规则) )中,我发现(在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

艾伦

4

2 回答 2

9

由于 Django 1.8order_by()不仅接受字段名称,还接受查询表达式

另一个答案中,我举了一个示例,说明如何覆盖列的默认排序规则。这里有用的查询表达式是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()in annotate()

于 2016-04-05T10:09:15.083 回答
2

好的。现在看来,原始查询是做到这一点的唯一方法。

但是有 django打开,希望很快就会关闭/解决。

于 2013-09-30T06:31:15.633 回答