August 4, 2020
欢迎来到Django 3.1!
这些发行说明涵盖 new features ,以及一些 backwards incompatible changes 从Django 3.0或更早版本升级时您需要注意这一点。我们 dropped some features 已经到了弃用周期的末尾,我们已经 begun the deprecation process for some features 。
见 如何将Django升级到更新版本 如果正在更新现有项目,则提供指南。
Django 3.1支持Python 3.6、3.7、3.8和3.9(自3.1.3起)。我们 highly recommend 并且仅官方支持每个系列的最新版本。
Django现在支持完全同步的请求路径,包括:
要开始使用Deliverc视图,您需要使用 async def
**
async def my_view(request):
await asyncio.sleep(0.5)
return HttpResponse("Hello, async world!")
无论您是在WSGI还是ASGI模式下运行,都支持所有同步功能。然而,在WSGI模式下使用Deliverc代码会带来性能损失。您可以在中阅读有关详细信息的更多信息 异步支持 文件。
您可以随心所欲地混合Inbox和同步视图、中间件和测试。Django将确保您始终获得正确的执行上下文。我们预计大多数项目将保持其大部分视图同步,并且只有少数几个以Inbox模式运行-但这完全是您的选择。
Django的ORM、缓存层和其他执行长期运行网络调用的代码片段还不支持Expressc访问。我们希望在即将推出的版本中添加对它们的支持。同步视图是理想的,但是,如果您在视图内执行大量API或HTTP调用,那么您现在可以本地并行执行所有这些HTTP调用,以大大加快视图的执行速度。
同步支持应该是完全向后兼容的,我们已经尝试确保它对您现有的同步代码没有速度回归。它应该对任何现有的Django项目没有明显影响。
Django现在包括 models.JSONField
和 forms.JSONField
可在所有支持的数据库后台使用。这两个字段都支持使用自定义的SON编码器和解码器。模型场支持内省, lookups, and transforms 以前仅限PostgreSQL::
from django.db import models
class ContactInfo(models.Model):
data = models.JSONField()
ContactInfo.objects.create(
data={
"name": "John",
"cities": ["London", "Cambridge"],
"pets": {"dogs": ["Rufus", "Meg"]},
}
)
ContactInfo.objects.filter(
data__name="John",
data__pets__has_key="dogs",
data__cities__contains="London",
).delete()
如果项目使用 django.contrib.postgres.fields.JSONField
,加上相关的表单字段和转换,您应该进行调整以使用新字段,并生成和应用数据库迁移。目前,旧字段和转换被保留为对新字段和转换的引用,并且 deprecated as of this release 。
DEFAULT_HASHING_ALGORITHM
设置¶新的 DEFAULT_HASHING_ALGORITHM
过渡设置允许指定默认哈希算法,用于编码cookie、管理站点中的密码重置令牌、用户会话和创建的签名 django.core.signing.Signer
和 django.core.signing.dumps()
。
Django 3.1中添加了对SHA-256的支持。如果您要将同一项目的多个实例升级到Django 3.1,您应该设置 DEFAULT_HASHING_ALGORITHM
至 'sha1'
在过渡期间,以便与Django的旧版本兼容。请注意,这需要Django 3.1.1+。完成到3.1的过渡后,您可以停止重写 DEFAULT_HASHING_ALGORITHM
。
自本版本起,该设置已被弃用,因为对使用SHA-1算法的令牌、cookie、会话和签名的支持将在Django 4.0中删除。
django.contrib.admin
¶新的 django.contrib.admin.EmptyFieldListFilter
为 ModelAdmin.list_filter
允许在管理更改集视图中过滤空值(空字符串和空值)。
管理更改列表视图右侧侧边栏中的过滤器现在包含一个用于清除所有过滤器的链接。
管理员现在在更大的屏幕上有一个侧边栏,以更轻松地导航。默认情况下启用,但可以使用自定义禁用 AdminSite
和设置 AdminSite.enable_nav_sidebar
至 False
。
呈现侧边栏需要访问当前请求才能设置CSS和ARIA角色可供性。这需要使用 'django.template.context_processors.request'
在 'context_processors'
选择 OPTIONS
。
初始为空 extra
现在可以以与动态创建的行相同的方式删除行。
XRegExp
已从2.0.0版本升级到3.2.0。
jQuery从3.4.1版本升级到3.5.1。
select 2库从4.0.7版本升级到4.0.13。
django.contrib.auth
¶PBKDF 2密码哈希器的默认迭代计数从180,000增加到216,000。
新的 PASSWORD_RESET_TIMEOUT
设置允许定义密码重置链接有效的秒数。这是鼓励的,而不是反对的 PASSWORD_RESET_TIMEOUT_DAYS
设置,该设置将在Django 4.0中删除。
密码重置机制现在使用SHA-256哈希算法。对使用旧哈希算法的代币的支持将持续到Django 4.0。
AbstractBaseUser.get_session_auth_hash()
现在使用SHA-256哈希算法。对使用旧哈希算法的用户会话的支持将保留到Django 4.0之前。
django.contrib.contenttypes
¶新的 remove_stale_contenttypes --include-stale-apps
选项允许从以前安装的已删除的应用程序中删除陈旧内容类型 INSTALLED_APPS
。
django.contrib.gis
¶relate
MariaDB现在支持查找。
添加了 LinearRing.is_counterclockwise
财产。
AsGeoJSON
Oracle现在支持。
添加了对PostGIS 3和GDAL 3的支持。
django.contrib.humanize
¶intword
模板过滤器现在支持负整数。
django.contrib.postgres
¶新的 BloomIndex
类允许创建 bloom
数据库中的索引。新 BloomExtension
迁移操作安装 bloom
扩展以添加对该指数的支持。
get_FOO_display()
现在支持 ArrayField
和 RangeField
。
新的 rangefield.lower_inc
, rangefield.lower_inf
, rangefield.upper_inc
,以及 rangefield.upper_inf
查找允许查询 RangeField
由绑定类型。
rangefield.contained_by
现在支持 SmallAutoField
, AutoField
, BigAutoField
, SmallIntegerField
,以及 DecimalField
。
SearchQuery
现在支持 'websearch'
在PostgreSQL 11+上搜索类型。
SearchQuery.value
现在支持查询表达。
新的 SearchHeadline
类允许突出显示搜索结果。
search
查找现在支持查询公式。
新的 cover_density
的参数 SearchRank
允许按覆盖密度进行排名。
新的 normalization
的参数 SearchRank
允许排名正常化。
新的 ExclusionConstraint.deferrable
属性允许创建可推迟的排除约束。
django.contrib.sessions
¶这个 SESSION_COOKIE_SAMESITE
现在的设置允许 'None'
(字符串)值显式声明cookie是与所有同站点和跨站点请求一起发送的。
django.contrib.staticfiles
¶这个 STATICFILES_DIRS
设置现在支持 pathlib.Path
。
这个 cache_control()
装饰器和 patch_cache_control()
方法现在支持 no-cache
指令适用于 Cache-Control
据报道, RFC 7234#section-5.2.2.2 。
delete()
现在又回来了 True
如果密钥被成功删除, False
否则的话。
这个 CSRF_COOKIE_SAMESITE
现在的设置允许 'None'
(字符串)值显式声明cookie是与所有同站点和跨站点请求一起发送的。
这个 EMAIL_FILE_PATH
设置,由 file email backend ,现在支持 pathlib.Path
。
django.views.debug.SafeExceptionReporterFilter
现在过滤敏感值 request.META
在异常报告中。
新的 SafeExceptionReporterFilter.cleansed_substitute
和 SafeExceptionReporterFilter.hidden_settings
属性允许自定义敏感设置, request.META
在异常报告中过滤。
技术404调试视图现在尊重 DEFAULT_EXCEPTION_REPORTER_FILTER
应用设置过滤时。
新的 DEFAULT_EXCEPTION_REPORTER
允许提供 django.views.debug.ExceptionReporter
用于自定义异常报告生成的子集。看到 自定义错误报告 了解更多细节。
FileSystemStorage.save()
方法现在支持 pathlib.Path
。
FileField
和 ImageField
现在接受呼叫 storage
.这允许您在运行时修改使用的存储,例如为不同的环境选择不同的存储。
ModelChoiceIterator
,使用者 ModelChoiceField
和 ModelMultipleChoiceField
,现在使用 ModelChoiceIteratorValue
小部件可以使用它来访问模型实例。看到 迭代关系选择 了解更多细节。
django.forms.DateTimeField
现在接受ISO 8601日期时间格式子集的日期,包括可选时区,例如 2019-10-10T06:47
, 2019-10-10T06:47:23+04:00
,或 2019-10-10T06:47:23Z
.如果提供时区,时区将始终保留,即使在 USE_TZ
是 False
。
另外, DateTimeField
现在使用 DATE_INPUT_FORMATS
除了……之外 DATETIME_INPUT_FORMATS
将字段输入转换为 datetime
价值。
MultiWidget.widgets
现在接受允许自定义子部件的字典 name
属性。
新的 BoundField.widget_type
属性可用于根据小部件类型动态调整表单渲染。
这个 LANGUAGE_COOKIE_SAMESITE
现在的设置允许 'None'
(字符串)值显式声明cookie是与所有同站点和跨站点请求一起发送的。
增加了对阿尔及利亚阿拉伯语、伊博语、吉尔吉斯语、塔吉克语和土库曼语的支持和翻译。
新的 check --database
选项允许指定数据库别名以运行 database
系统检查。以前,这些检查是针对所有配置的 DATABASES
通过使 database
标签到命令。
新的 migrate --check
当检测到未应用的迁移时,选项会使命令以非零状态退出。
新的 returncode
论据 CommandError
允许自定义管理命令的退出状态。
新的 dbshell -- ARGUMENTS
选项允许将额外参数传递到数据库的命令行客户端。
新的 ExtractIsoWeekDay
功能从ISO-8601工作日提取 DateField
和 DateTimeField
,以及新的 iso_week_day
查找允许按ISO-8601每周的一天进行查询。
QuerySet.explain()
现在支持:
TREE
格式为SQL 8.0.16+,
analyze
SQL 8.0.18+和MariaDB上的选项。
增列 PositiveBigIntegerField
它的作用很像 PositiveIntegerField
除了它只允许在一定(取决于数据库)限制下的值。值从 0
至 9223372036854775807
在Django支持的所有数据库中都安全。
新的 RESTRICT
选项 on_delete
的论点 ForeignKey
和 OneToOneField
模拟SQL约束的行为 ON DELETE RESTRICT
。
CheckConstraint.check
现在支持布尔表达式。
这个 RelatedManager.add()
, create()
,以及 set()
方法现在接受可调用值作为 through_defaults
争论。
新的 is_dst
属性的参数 QuerySet.datetimes()
确定不存在和模糊的日期时间的处理方式。
新的 F
表达式 bitxor()
方法允许 bitwise XOR operation 。
QuerySet.bulk_create()
现在,在使用MariaDB 10.5+时设置对象的主密钥。
这个 DatabaseOperations.sql_flush()
方法现在通过使用在SQL上生成更有效的SQL DELETE
而不是 TRUNCATE
不需要重置序列的表的陈述。
SQLite函数现在标记为 deterministic
在Python 3.8+上。这允许在检查约束和部分索引中使用它们。
新的 UniqueConstraint.deferrable
属性允许创建可推迟的唯一约束。
Paginator
现在可以迭代以产生其页面。
如果 ALLOWED_HOSTS
为空并且 DEBUG=True
,现在允许在 Host
标题,例如 static.localhost
。
HttpResponse.set_cookie()
和 HttpResponse.set_signed_cookie()
现在允许使用 samesite='None'
(字符串)显式声明cookie是与所有同站点和跨站点请求一起发送的。
新的 HttpRequest.accepts()
方法根据 Accept
HTTP标头。
这个 SECURE_REFERRER_POLICY
现在设置默认为 'same-origin'
.经过此配置, SecurityMiddleware
设置 Referrer策略 标题收件人 same-origin
在所有尚未具有它的响应上。这可以防止 Referer
标题被发送到其他来源。如果您需要之前的行为,请显式设置 SECURE_REFERRER_POLICY
至 None
。
的默认算法 django.core.signing.Signer
, django.core.signing.loads()
,以及 django.core.signing.dumps()
更改为SHA-256。Django 4.0之前,对使用旧SHA-1算法生成的签名的支持仍然存在。
另外,新的 algorithm
属性的参数 Signer
允许自定义哈希算法。
重命名的 translate
和 blocktranslate
在模板代码中引入了模板标签以进行国际化。老 trans
和 blocktrans
模板标签别名继续有效,并将在可预见的未来保留。
这个 include
模板标签现在接受模板名称的迭代。
SimpleTestCase
现在实施 debug()
允许运行测试而无需收集结果和捕获异常的方法。这可用于支持在调试器下运行测试。
新的 MIGRATE
测试数据库设置允许在测试数据库创建期间禁用迁移。
DiscoverRunner
can now discard output for
passing tests using the test --buffer
option.
DiscoverRunner
现在跳过对数据库的运行系统检查 referenced by tests 。
TransactionTestCase
由于以下原因,现在在SQL上拆除速度更快 flush
命令改进。作为副作用,后者不再在拆除时自动重置序列。使 TransactionTestCase.reset_sequences
如果您的测试需要此功能。
Path converters 现在可以筹集 ValueError
在……里面 to_url()
在反向URL时指示不匹配。
filepath_to_uri()
现在支持 pathlib.Path
。
parse_duration()
现在支持ISO 8601格式的小数的逗号分隔符。
parse_datetime()
, parse_duration()
,以及 parse_time()
现在支持毫秒的逗号分隔符。
SQLite后台现在支持 pathlib.Path
对于 NAME
布景。
这个 settings.py
产生 startproject
命令现在使用 pathlib.Path
而不是 os.path
用于构建文件系统路径。
这个 TIME_ZONE
现在允许在支持时区的数据库上进行设置。
本节描述第三方数据库后端可能需要的更改。
DatabaseOperations.fetch_returned_insert_columns()
现在需要额外的 returning_params
争论。
connection.timezone
属性现已被 'UTC'
默认情况下,或 TIME_ZONE
什么时候 USE_TZ
是 True
在支持时区的数据库上。而此前有 None
在支持时区的数据库上。
connection._nodb_connection
属性更改为 connection._nodb_cursor()
方法,现在返回一个上下文管理器,该管理器产生一个指针,并在退出 with
陈述。
DatabaseClient.runshell()
现在需要额外的 parameters
参数作为要传递给命令行客户端的额外参数列表。
这个 sequences
的位置论据 DatabaseOperations.sql_flush()
被布尔仅关键字参数替换 reset_sequences
。如果 True
,截断表的序列将被重置。
这个 allow_cascade
的论点 DatabaseOperations.sql_flush()
现在是一个纯关键词的参数。
这个 using
的位置论据 DatabaseOperations.execute_sql_flush()
被删除。该方法现在使用被调用实例的数据库。
第三方数据库后台必须实施支持 JSONField
或设置 DatabaseFeatures.supports_json_field
至 False
.如果不支持存储基元,请设置 DatabaseFeatures.supports_primitives_in_json_field
至 False
.如果存在真正的SON数据类型,则设置 DatabaseFeatures.has_native_json_field
至 True
。如果 jsonfield.contains
和 jsonfield.contained_by
不支持,设置 DatabaseFeatures.supports_json_field_contains
至 False
。
第三方数据库后台必须对 JSONField
或设置 can_introspect_json_field
至 False
。
对MariaDB 10.1的上游支持将于2020年10月结束。Django 3.1支持MariaDB 10.2及更高版本。
contrib.admin
浏览器支持¶管理员不再支持旧版Internet Explorer浏览器。看到 the admin FAQ 有关支持的浏览器的详细信息。
AbstractUser.first_name
max_length
增加至150¶移民 django.contrib.auth.models.User.first_name
包括在内。如果您有继承自定义用户模型 AbstractUser
,您需要为您的用户模型生成并应用数据库迁移。
如果您想保留名字的30个字符限制,请使用自定义表格::
from django import forms
from django.contrib.auth.forms import UserChangeForm
class MyUserChangeForm(UserChangeForm):
first_name = forms.CharField(max_length=30, required=False)
如果您希望在编辑用户时在管理员中保留此限制,请设置 UserAdmin.form
使用此表单:
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
class MyUserAdmin(UserAdmin):
form = MyUserChangeForm
admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)
使用的缓存密钥 cache
和产生 make_template_fragment_key()
与Django旧版本生成的密钥不同。升级到Django 3.1后,对任何之前缓存的模板片段的第一个请求都将是缓存未命中。
返回重定向回退或来自 set_language()
现在的观点是基于 Accept
HTTP标头而不是 X-Requested-With
HTTP标头存在。
的兼容性导入 django.core.exceptions.EmptyResultSet
在……里面 django.db.models.query
, django.db.models.sql
,以及 django.db.models.sql.datastructures
都被移除了。
的兼容性导入 django.core.exceptions.FieldDoesNotExist
在……里面 django.db.models.fields
被移除。
的兼容性导入 django.forms.utils.pretty_name()
和 django.forms.boundfield.BoundField
在……里面 django.forms.forms
都被移除了。
的兼容性导入 Context
, ContextPopException
,以及 RequestContext
在……里面 django.template.base
都被移除了。
的兼容性导入 django.contrib.admin.helpers.ACTION_CHECKBOX_NAME
在……里面 django.contrib.admin
被移除。
这个 STATIC_URL
和 MEDIA_URL
设置为相对路径的设置现在以服务器提供的值为开头 SCRIPT_NAME
(或 /
如果未设置)。此更改不应影响设置为有效URL或绝对路径的设置。
ConditionalGetMiddleware
不再添加 ETag
标题为空的响应 content
。
django.utils.decorators.classproperty()
装修师被公开并转移到 django.utils.functional.classproperty()
。
floatformat
模板过滤器现在输出(正) 0
对于四舍五入为零的负值。
Meta.ordering
和 Meta.unique_together
中的模型选项 django.contrib
以前是二元组的模块现在是列表。
管理日历小部件现在根据开放组规范处理两位数的年份,即69和99之间的值映射到上一个世纪,0和68之间的值映射到当前世纪。
仅限日期格式将从默认列表中删除 DATETIME_INPUT_FORMATS
。
这个 FileInput
小部件不再使用 required
初始数据存在时的HTML属性。
未登记的人 django.views.debug.ExceptionReporterFilter
类被删除。按照 自定义错误报告 文档、要使用的类 DEFAULT_EXCEPTION_REPORTER_FILTER
需要继承 django.views.debug.SafeExceptionReporterFilter
。
由设置的缓存超时 cache_page()
装饰师现在优先于 max-age
指令从该 Cache-Control
标题。
提供非本地远程现场 ForeignKey.to_field
现在提出了争论 FieldError
。
SECURE_REFERRER_POLICY
现在默认为 'same-origin'
。请参阅 What's New Security section 有关更多详细信息,请参见上文。
check
管理命令现在运行 database
系统仅检查使用指定的数据库别名 check --database
选择。
migrate
管理命令现在运行 database
系统仅检查要迁移的数据库。
管理CSS类 row1
和 row2
被删除,有利于 :nth-child(odd)
和 :nth-child(even)
伪类。
这个 make_password()
函数现在要求其参数是字符串或字节。其他类型应该显式转换为其中之一。
未登记的人 version
参数设置为 AsKML
函数被删除。
JSON and YAML serializers ,使用者 dumpdata
,现在默认使用Unicode转储所有数据。如果您需要之前的行为,请通过 ensure_ascii=True
转换为SON序列化器,或 allow_unicode=False
到YML序列化器。
自动加载器不再监视内置Django翻译文件中的更改。
支持的最低版本 mysqlclient
从1.3.13增加到1.4.0。
未登记的人 django.contrib.postgres.forms.InvalidJSONInput
和 django.contrib.postgres.forms.JSONString
已移至 django.forms.fields
。
未登记的人 django.contrib.postgres.fields.jsonb.JsonAdapter
类被删除。
这个 {% localize off %}
标签和 unlocalize
过滤器不再尊重 DECIMAL_SEPARATOR
布景。
支持的最低版本 asgiref
从3.2增加到3.2.10。
这个 Media 类现在呈现 <script>
没有的标签 type
要遵循的属性 WHATWG recommendations 。
ModelChoiceIterator
,使用者 ModelChoiceField
和 ModelMultipleChoiceField
,现在产生2-tuple选择,包含 ModelChoiceIteratorValue
作为第一个例子 value
每个选择中的元素。在大多数情况下,这是透明的代理,但如果您需要 field
重视本身,使用 ModelChoiceIteratorValue.value
而是属性。
JSONField
¶django.contrib.postgres.fields.JSONField
和 django.contrib.postgres.forms.JSONField
被反对支持 models.JSONField
和 forms.JSONField
。
未登记的人 django.contrib.postgres.fields.jsonb.KeyTransform
和 django.contrib.postgres.fields.jsonb.KeyTextTransform
也反对支持中的转换 django.db.models.fields.json
。
新的 JSONField
S, KeyTransform
,以及 KeyTextTransform
可在所有支持的数据库后台使用。
PASSWORD_RESET_TIMEOUT_DAYS
设置已弃用,而是支持 PASSWORD_RESET_TIMEOUT
。
无证使用 isnull
使用非布尔值进行查找,因为右侧不建议使用,使用 True
或 False
取而代之的是。
几乎没有记录的 django.db.models.query_utils.InvalidQuery
异常类被废弃,支持 FieldDoesNotExist
和 FieldError
。
这个 django-admin.py
入口点已被废弃,转而支持 django-admin
。
这个 HttpRequest.is_ajax()
该方法被废弃,因为它依赖于特定于jSYS的方式来表示AJax调用,而当前的使用倾向于使用JavaScript Fetch API .根据您的用例,您可以编写自己的AJax检测方法,也可以使用新的 HttpRequest.accepts()
如果您的代码取决于客户端,则使用方法 Accept
HTTP标头。
如果您正在编写自己的AJax检测方法, request.is_ajax()
可以完全复制 request.headers.get('x-requested-with') == 'XMLHttpRequest'
。
传球 None
作为第一个论点 django.utils.deprecation.MiddlewareMixin.__init__()
已弃用。
使用的cookie值的编码格式 CookieStorage
与Django旧版本生成的格式不同。对旧格式的支持将持续到Django 4.0。
会话的编码格式与Django旧版本生成的格式不同。对旧格式的支持将持续到Django 4.0。
纯粹的文献记录 providing_args
论据 Signal
已被废弃。如果您依赖此参数作为文档,则可以将文本移动到代码注释或文档字符串。
叫唤 django.utils.crypto.get_random_string()
无.class=‘class 3’> length
论点已被废弃。
这个 list
消息 ModelMultipleChoiceField
不推荐使用,而支持 invalid_list
。
将原始列别名传递给 QuerySet.order_by()
已被废弃。通过在 RawSQL
而是提前。
这个 NullBooleanField
不推荐使用Model字段,而是支持 BooleanField(null=True, blank=True)
。
django.conf.urls.url()
的别名 django.urls.re_path()
已弃用。
这个 {% ifequal %}
和 {% ifnotequal %}
模板标签被废弃,支持 {% if %}
。 {% if %}
涵盖所有用例,但如果您需要继续使用这些标签,可以将它们从Django提取到模块中,并作为内置标签包含在 'builtins'
中的选项 OPTIONS
。
DEFAULT_HASHING_ALGORITHM
过渡设置已弃用。
这些功能已达到弃用周期的末尾,并在Django 3.1中删除。
看见 2.2中不推荐的功能 有关这些更改的详细信息,包括如何删除这些功能的使用。
django.utils.timezone.FixedOffset
被移除。
django.core.paginator.QuerySetPaginator
被移除。
一个模特的 Meta.ordering
不会影响 GROUP BY
查询。
django.contrib.postgres.fields.FloatRangeField
和 django.contrib.postgres.forms.FloatRangeField
都被移除了。
这个 FILE_CHARSET
设置已删除。
django.contrib.staticfiles.storage.CachedStaticFilesStorage
被移除。
这个 RemoteUserBackend.configure_user()
方法需要 request
作为第一个立场论点。
支持 SimpleTestCase.allow_database_queries
和 TransactionTestCase.multi_db
被移除。
7月 22, 2024