django - 查询集排序 : Specifying column collation for django ORM query

标签 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')

编辑1: 显然我不是唯一一个要求这个的人: https://groups.google.com/forum/#!msg/django-developers/0iESVnawNAY/JefMfAm7nQMJ

艾伦

最佳答案

正如@olau 在评论中提到的那样,自 Django 3.2 Collate 以来实用程序可用。对于较旧的 Django 版本,请参阅以下代码示例下方的原始信息:

# Starting with Django 3.2:
Test.objects.order_by(Collate('nimi', 'et_EE'))

因为 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 子句中使用它,则可以在 annotate() 中使用 Func()

关于django - 查询集排序 : Specifying column collation for django ORM query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18935712/

相关文章:

postgresql - 使用 PostgreSQL 和 json-api 的发布请求返回一个空体

django - Django select_related链接的外键

python - .filter() 与 .get() 对于单个对象? ( Django )

python - 如何在 django 中进行内部连接?

django - 以 django 形式创建一个选择器小部件

python - Django 与 Scrapy 的关系如何保存项目?

sql - Postgres 中的多表 count()

sql - PostgreSQL:更新主键,避免冲突

python - 将 any 与 QuerySet 一起使用是否不是最佳选择?

python - Django 中基于表单的 Kerberos 身份验证