查询集排序。为django ORM查询指定列的整理方式

问题描述 投票:3回答:2

我开始研究为什么我的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 postgresql django-queryset
2个回答
6
投票

自从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().


2
投票

好吧。似乎现在Raw Queries是唯一的方法来做到这一点。

但有django 门票 开,希望能在不久的将来得到解决。

© www.soinside.com 2019 - 2024. All rights reserved.