我开始研究为什么我的Django Model.objects.filter(condition = variable).order_by(textcolumn)查询不能以正确的顺序产生对象。结果发现是数据库(Postgresql)的问题。
在我之前的问题中(Postgresql排序语言特定字符(整理)。)我想明白了(有了很多的帮助,从。零点323 在实际工作中),我可以像这样指定每个数据库查询的整理。
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.comforum#!msgdjango-developers0iESVnawNAYJefMfAm7nQMJ。
艾伦
自从Django 1.8 order_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;
就是说,在这个SQL中,整理被覆盖了。ORDER BY
子句,而不是在 SELECT
子句。然而,如果你需要在一个 WHERE
子句,你可以使用 Func()
在 annotate()
.
好吧。似乎现在Raw Queries是唯一的方法来做到这一点。
但有django 门票 开,希望能在不久的将来得到解决。