首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不推荐使用Django3.1将原始列别名传递给QuerySet.order_by()

不推荐使用Django3.1将原始列别名传递给QuerySet.order_by()
EN

Stack Overflow用户
提问于 2021-04-01 08:56:07
回答 1查看 76关注 0票数 1

我正在做一个刚刚迁移到django 3.1的项目。我需要删除“将原始列别名传递给QuerySet.order_by()”的用法。但是,我不确定我的项目是否正在使用它。因此,我需要了解“将原始列别名传递给QuerySet.order_by()”的实际工作原理,如果有人能为我提供一个将原始列别名传递给QuerySet.order_by()的代码示例,这将是非常有帮助的。

EN

回答 1

Stack Overflow用户

发布于 2021-09-30 02:02:16

tl;dr:

使用点分隔语法引用表和列的

  • 查询应该是changed
  • queries查询,而使用-delimited引用表和列的查询则可以按原样使用

弃用的运行时检测

首先,检测不推荐使用的模式的最简单方法是使用PYTHONWARNINGS=alwayspython -Wd运行项目和/或测试套件。如果这样做,您将看到一些有用的警告,可以突出显示错误模式所在的确切行。

例如,当您使用Django 3.1运行我的示例代码时,会出现一个警告:

代码语言:javascript
复制
RemovedInDjango40Warning: Passing column raw column aliases to order_by() is deprecated. Wrap '-auth_user_groups.id' in a RawSQL expression before passing it to order_by().
  User.objects.filter(groups__name='teachers').order_by('-auth_user_groups.id')

示例-修复错误查询

考虑以下问题-有两个查询,每个查询都将按任期对教师进行排序:

代码语言:javascript
复制
from django.contrib.auth.models import User
from django.db.models.expressions import RawSQL

# Deprecated!
# The value passed to `order_by` references a column on a table
User.objects.filter(groups__name='teachers').order_by('-auth_user_groups.id')

# Safe! We're now using RawSQL to make that same reference.
User.objects.filter(groups__name='teachers').order_by(
    RawSQL('auth_user_groups.id', tuple()).desc()
)

这两个查询是等效的,并转换为(缩写) SQL:

代码语言:javascript
复制
SELECT auth_user.*
  FROM auth_user
 INNER JOIN auth_user_groups ON auth_user.id = auth_user_groups.user_id
 INNER JOIN auth_group ON auth_user_groups.group_id = auth_group.id
 WHERE auth_group.name = 'teachers'
 ORDER BY auth_user_groups.id DESC

示例-未受影响的查询

不过,大多数查询都不引用表名&使用点分隔语法的列。

这些查询很好,不需要更改:

代码语言:javascript
复制
from django.contrib.auth.models import User
from django.db.models.expressions import RawSQL

# Safe - we're ordering by `auth_user.date_joined`
User.objects.order_by('date_joined')

# Safe - we're ordering by `auth_group.name` after a JOIN on auth_group
User.objects.order_by('groups__name')
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66897125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档