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 现在可以使用 test --buffer 选项.
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 被移除。
5月 28, 2025