gpt4 book ai didi

django 3.1 将原始列别名传递给 QuerySet.order_by() 已弃用

转载 作者:行者123 更新时间:2023-12-05 02:43:30 24 4
gpt4 key购买 nike

我正在开发一个刚刚迁移到 django 3.1 的项目。我需要删除这个“将原始列别名传递给 QuerySet.order_by()”的用法。但是,我不确定我的项目是否正在使用它。所以我需要了解“将原始列别名传递给 QuerySet.order_by()”实际上是如何工作的,如果有人可以向我提供一个将原始列别名传递给 QuerySet.order_by() 的代码示例,那真的是有帮助和赞赏。

最佳答案

tl;博士:

  • 应更改使用点分隔语法引用表和列的查询
  • 使用 __ 分隔的表和列引用的查询可以按原样使用

弃用的运行时检测

嗯,首先,检测已弃用模式的使用的最简单方法是使用 PYTHONWARNINGS=alwayspython -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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com