作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个刚刚迁移到 django 3.1 的项目。我需要删除这个“将原始列别名传递给 QuerySet.order_by()”的用法。但是,我不确定我的项目是否正在使用它。所以我需要了解“将原始列别名传递给 QuerySet.order_by()”实际上是如何工作的,如果有人可以向我提供一个将原始列别名传递给 QuerySet.order_by() 的代码示例,那真的是有帮助和赞赏。
最佳答案
tl;博士:
__
分隔的表和列引用的查询可以按原样使用嗯,首先,检测已弃用模式的使用的最简单方法是使用 PYTHONWARNINGS=always
或 python -Wd
运行您的项目和/或测试套件。如果这样做,您会看到一些有用的警告,这些警告可以突出显示错误模式所在的确切行。
例如,当您使用 Django 3.1 运行我的示例代码时引发的警告:
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')
考虑以下 - 有两个查询,每个查询都会按任期对教师进行排序:
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:
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
不过,大多数查询不使用点分隔语法引用表名和列。
这些查询很好,不需要更改:
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')
关于django 3.1 将原始列别名传递给 QuerySet.order_by() 已弃用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66897125/
我是一名优秀的程序员,十分优秀!