Django 3.2版本说明

April 6, 2021

欢迎来到Django 3.2!

这些发行说明涵盖 new features ,以及一些 backwards incompatible changes 从Django 3.1或更早版本升级时您需要注意这一点。我们 begun the deprecation process for some features

如何将Django升级到更新版本 如果正在更新现有项目,则提供指南。

Django 3.2被指定为 long-term support release .它将在发布后至少三年内收到安全更新。对之前的RTS Django 2.2的支持将于2022年4月结束。

python兼容性

Django 3.2支持Python3.6、3.7、3.8、3.9和3.10(从3.2.9开始)。我们 highly recommend 并且仅官方支持每个系列的最新版本。

Django 3.2中的新功能

自动 AppConfig 发现

大多数可插入应用程序定义了 AppConfig 中的亚类 apps.py 子模块。许多人定义了 default_app_config 指向这个类的变量 __init__.py

apps.py 子模块存在并定义了一个 AppConfig 子类别,Django现在自动使用该配置,因此您可以删除 default_app_config

default_app_config 使其可以仅声明应用程序的路径 INSTALLED_APPS (例如: 'django.contrib.admin' )而不是应用程序配置的路径(例如 'django.contrib.admin.apps.AdminConfig' ).它的推出是为了与前一种风格向后兼容,旨在将生态系统切换到后一种风格,但这种切换并没有发生。

具有自动 AppConfig 发现, default_app_config 不再需要。因此,它被废弃了。

看见 配置应用程序 获取完整的详细信息。

自定义自动创建的公钥类型

定义模型时,如果模型中没有用定义字段 primary_key=True 添加了隐式主密钥。现在可以通过 DEFAULT_AUTO_FIELD 设置和 AppConfig.default_auto_field 属性不再需要在所有型号中重写公钥。

维护历史行为、默认值 DEFAULT_AUTO_FIELDAutoField .从3.2个新项目开始 DEFAULT_AUTO_FIELD 设置为 BigAutoField .此外,新应用程序是通过以下方式生成的 AppConfig.default_auto_field 设置为 BigAutoField .未来Django会发布默认值 DEFAULT_AUTO_FIELD 将变更为 BigAutoField

为了避免将来不必要的迁移,要么显式设置 DEFAULT_AUTO_FIELDAutoField **

DEFAULT_AUTO_FIELD = "django.db.models.AutoField"

或根据每个应用程序配置它::

from django.apps import AppConfig


class MyAppConfig(AppConfig):
    default_auto_field = "django.db.models.AutoField"
    name = "my_app"

或根据每个型号:::

from django.db import models


class MyModel(models.Model):
    id = models.AutoField(primary_key=True)

预计默认值会发生变化,如果您没有明确的设置,系统检查将提供警告 DEFAULT_AUTO_FIELD

更改的值时 DEFAULT_AUTO_FIELD ,当前不能生成已有自动创建直通表主键的迁移。请参阅 DEFAULT_AUTO_FIELD 有关迁移此类表的详细信息,请参阅文档。

函数索引

新的 *expressions 的位置论据 Index() 允许在表达和数据库函数上创建功能索引。例如::

from django.db import models
from django.db.models import F, Index, Value
from django.db.models.functions import Lower, Upper


class MyModel(models.Model):
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
    height = models.IntegerField()
    weight = models.IntegerField()

    class Meta:
        indexes = [
            Index(
                Lower("first_name"),
                Upper("last_name").desc(),
                name="first_last_name_idx",
            ),
            Index(
                F("height") / (F("weight") + Value(5)),
                name="calc_idx",
            ),
        ]

使用 Meta.indexes 选择。

pymemcache 支持

新的 django.core.cache.backends.memcached.PyMemcacheCache 缓存后端允许使用 pymemcache 用于Memcached的库。 pymemcache 需要3.4.0或更高版本。有关更多详细信息,请参阅 documentation on caching in Django

管理站点的新装饰师

新的 display() 装饰器允许轻松地向可与之一起使用的自定义显示功能添加选项 list_displayreadonly_fields

同样,新的 action() 装饰器允许轻松地向可与之一起使用的动作功能添加选项 actions

使用 @display 装饰者的优点是现在可以使用 @property 当需要在自定义方法上指定属性时,装饰器。在此之前,有必要使用 property() 在将所需的属性分配给方法后,改为函数。

使用装饰器的优点是,这些选项更容易处理,因为可以由代码编辑器中的完成实用程序建议它们。它们只是一种便利,并且仍然为引擎盖下的功能设置了相同的属性。

次要特征

django.contrib.admin

  • ModelAdmin.search_fields 现在允许搜索带有空白的引用短语。

  • 如果目标模型已在管理员中注册,只读相关字段现在将呈现为可导航链接。

  • 管理员现在支持主题化,并包括根据浏览器设置启用的黑暗主题。看到 主题支持 了解更多详细信息。

  • ModelAdmin.autocomplete_fields 现在尊重 ForeignKey.to_fieldForeignKey.limit_choices_to 搜索相关模型时。

  • 管理员现在安装一个最终的全部捕获视图,该视图将未经身份验证的用户重定向到登录页面,而不考虑URL是否有效。这可以防止潜在的模型枚举隐私问题。

    虽然不建议,但您可以设置新的 AdminSite.final_catch_all_viewFalse 禁用全面视图。

django.contrib.auth

  • PBKDF 2密码哈希器的默认迭代计数从216,000增加到260,000。

  • Argon 2密码哈希器的默认变体更改为Argon 2id。 memory_costparallelism 分别增加到102,400和8,以匹配 argon2-cffi 默认值。

    增加 memory_cost 将所需内存从512 KB推到100 MB。这仍然相当保守,但可能会在内存受限的环境中导致问题。如果是这种情况,可以对现有哈希器进行子分类以覆盖默认设置。

  • Argon 2、MD5、PBKDF 2、SHA-1密码哈希器的默认盐量从71位增加到128位。

django.contrib.contenttypes

django.contrib.gis

django.contrib.postgres

  • 新的 ExclusionConstraint.include 属性允许在PostgreSQL 12+上创建覆盖排除约束。

  • 新的 ExclusionConstraint.opclasses 属性允许设置PostgreSQL运算符类。

  • JSONBAgg.ordering 属性确定聚合元素的顺序。

  • 新的 JSONBAgg.distinct 属性确定聚合值是否不同。

  • 这个 CreateExtension 操作现在检查该扩展是否已存在于数据库中,如果存在,则跳过迁移。

  • 新的 CreateCollationRemoveCollation 操作允许在PostgreSQL上创建和删除排序规则。看到 使用迁移管理排序规则 了解更多详细信息。

  • 查找 ArrayField 现在允许包含运算式的(非嵌套)数组作为右侧。

  • 新的 OpClass() express允许使用自定义运算符类在express上创建函数索引。看到 函数索引 了解更多详细信息。

django.contrib.sitemaps

django.contrib.syndication

  • 新的 item_comments hook允许为每个提要项指定评论URL。

数据库后端

  • 第三方数据库后台现在可以使用新的跳过Django测试套件中的预期失败测试或标记为预期失败测试 DatabaseFeatures.django_test_skipsdjango_test_expected_failures 属性。

装饰者

错误报告

文件上传

形式

通用视图

管理命令

  • loaddata 现在支持存储在XZ档案中的固定装置 (.xz )和LZMA档案 (.lzma )。

  • dumpdata 现在可以在 bz2gzlzma ,或 xz 格式。

  • makemigrations 现在可以在没有活动数据库连接的情况下调用。在这种情况下,将跳过检查一致的迁移历史记录。

  • BaseCommand.requires_system_checks 现在支持指定标签列表。在执行命令之前,将检查所选标签中注册的系统检查是否存在错误。在早期版本中,要么执行所有系统检查,要么不执行任何系统检查。

  • 更新了Windows上对彩色终端输出的支持。自动检测各种现代终端环境,并改进了在其他情况下启用支持的选项。看到 语法颜色标记 了解更多详细信息。

迁徙

  • 新的 Operation.migration_name_fragment 属性允许提供文件名片段,该片段将用于命名仅包含该操作的迁移。

  • 迁移现在支持从 pathlib ,以及 os.PathLike 实例。

模型

分页

请求和响应

安防

串行化

  • 新的 JSONL 序列化器允许使用SON Lines格式 dumpdataloaddata .这对于填充大型数据库可能很有用,因为数据是逐行加载到内存中的,而不是一次全部加载。

信号

模板

测验

公用事业

  • 新的 depth 的参数 django.utils.timesince.timesince()django.utils.timesince.timeuntil() 函数允许指定要返回的相邻时间单位的数量。

验证器

  • 内置验证器现在将提供的值包括在 params 提出的论点 ValidationError .这允许自定义错误消息使用 %(value)s 占位符.

  • 这个 ValidationError 相等运算符现在忽略 messagesparams 订购。

3.2中向后不兼容的更改

数据库后端API

本节描述第三方数据库后端可能需要的更改。

  • 新的 DatabaseFeatures.introspected_field_types 属性取代了这些功能:

    • can_introspect_autofield

    • can_introspect_big_integer_field

    • can_introspect_binary_field

    • can_introspect_decimal_field

    • can_introspect_duration_field

    • can_introspect_ip_address_field

    • can_introspect_positive_integer_field

    • can_introspect_small_integer_field

    • can_introspect_time_field

    • introspected_big_auto_field_type

    • introspected_small_auto_field_type

    • introspected_boolean_field_type

  • 启用对覆盖指数的支持 (Index.include )并涵盖独特的限制 (UniqueConstraint.include ),设置 DatabaseFeatures.supports_covering_indexesTrue

  • 第三方数据库后台必须对列数据库排序规则实施支持 CharField s和 TextField s或设置 DatabaseFeatures.supports_collation_on_charfieldDatabaseFeatures.supports_collation_on_textfieldFalse .如果不支持非确定性排序,请设置 supports_non_deterministic_collationsFalse

  • DatabaseOperations.random_function_sql() 被删除,转而采用新的 Random 数据库功能。

  • DatabaseOperations.date_trunc_sql()DatabaseOperations.time_trunc_sql() 现在选择可选的 tzname 参数以便在特定时区进行截断。

  • DatabaseClient.runshell() 现在从 DatabaseClient.settings_to_cmd_args_env() 法第三方数据库后台必须实施 DatabaseClient.settings_to_cmd_args_env() 或覆盖 DatabaseClient.runshell()

  • 第三方数据库后台必须实现对功能索引的支持 (Index.expressions )或设置 DatabaseFeatures.supports_expression_indexesFalse 。如果 COLLATE 不是 CREATE INDEX 陈述,集 DatabaseFeatures.collate_as_index_expressionTrue

django.contrib.admin

  • 管理员中的翻页链接现在是1-索引而不是0-索引,即第一页的查询字符串是 ?p=1 而不是 ?p=0

  • 新的管理员全面查看将打破在管理员URL之后路由并匹配管理员URL前置的URL模式。您可以调整URL顺序,或者在必要时设置 AdminSite.final_catch_all_viewFalse ,禁用全面视图。看到 Django 3.2中的新功能 了解更多详细信息。

  • 管理员不再包含迷你化的JavaScript文件。如果您需要缩小这些文件,请考虑使用第三方应用程序或外部构建工具。与管理员一起打包的缩小版供应的JavaScript文件(例如 jquery.min.js )仍然包括在内。

  • ModelAdmin.prepopulated_fields 不再删除英语停止词,例如 'a''an'

django.contrib.gis

  • 已删除对PostGIS 2.2的支持。

  • Oracle后台现在会克隆多边形(以及包含多边形的几何集合),然后重新调整多边形并将其保存到数据库。它们不再原地突变。如果您在保存模型后使用多边形,您可能会注意到这一点。

放弃对PostgreSQL 9.5的支持

对PostgreSQL 9.5的上游支持将于2021年2月结束。Django 3.2支持PostgreSQL 9.6及更高版本。

放弃对SQL 5.6的支持

对SQL 5.6的上游支持将于2021年4月结束。Django 3.2支持SQL 5.7及更高版本。

其他

  • Django现在支持非“pytz”时区,例如Python 3.9+的 zoneinfo 模块及其后台。

  • 未登记的人 SpatiaLiteOperations.proj4_version() 方法被重命名为 proj_version()

  • slugify() 现在删除前破折号和尾随破折号以及强调线。

  • 这个 intcommaintword 模板筛选器不再依赖 USE_L10N 布景。

  • 支持 argon2-cffi < 19.1.0已删除。

  • 禁用国际化时,缓存项不再包括语言 (USE_I18N = False )并启用本地化 (USE_L10N = True ).在此类配置下升级到Django 3.2后,对任何之前缓存的值的第一个请求都将是缓存未命中。

  • ForeignKey.validate() 现在使用 _base_manager 而不是 _default_manager 检查相关实例是否存在。

  • 当应用程序定义 AppConfig 中的亚类 apps.py 子模块,Django现在自动使用此配置,即使没有启用它 default_app_config 。集 default = FalseAppConfig 如果您需要防止这种行为,则可以使用子类。看到 Django 3.2中的新功能 了解更多详细信息。

  • 实例化抽象模型现在会产生 TypeError

  • 关键字参数 setup_databases() 现在仅限关键字。

  • 未登记的人 django.utils.http.limited_parse_qsl() 功能已删除。请使用 urllib.parse.parse_qsl() 取而代之的是。

  • django.test.utils.TestContextDecorator 现在使用 addCleanup() 以便清理工作在 setUp() 之前调用过方法 TestContextDecorator.disable()

  • SessionMiddleware 现在引发一个 SessionInterrupted 例外而不是 SuspiciousOperation 当会话在并发请求中被销毁时。

  • 这个 django.db.models.Field 等式运算符现在可以正确区分模型之间的继承字段实例。此外,现在还定义了此类字段的顺序。

  • 未登记的人 django.core.files.locks.lock() 函数现在返回 False 如果文件无法锁定,而不是引发 BlockingIOError

  • 现在,当用户电子邮件更改时,密码重置机制会使令牌无效。

  • makemessages 命令不再处理使用指定的无效区域设置 makemessages --locale 选项,当它们包含连字符时 ('-' )。

  • 这个 django.contrib.auth.forms.ReadOnlyPasswordHashField 表单字段现在是 disabled 在默认情况下因此 UserChangeForm.clean_password() 不再需要返回初始值。

  • 这个 cache.get_many()get_or_set()has_key()incr()decr()incr_version() ,以及 decr_version() 缓存操作现在可以正确处理 None 以与任何其他值相同的方式存储在缓存中,而不是表现得好像密钥不存在一样。

    由于一项 python-memcached 限制,对于不建议的行为保留之前的行为 MemcachedCache 后端。

  • SQLite支持的最低版本从3.8.3增加到3.9.0。

  • CookieStorage 现在将消息存储在 RFC 6265 兼容的格式。对使用旧格式的cookie的支持将持续到Django 4.1。

  • 支持的最低版本 asgiref 从3.2.10增加到3.3.2。

3.2中废弃的功能

其他

  • 删除不支持创建深副本的对象 copy.deepcopy() 要将中的属性分类,请执行以下操作 TestCase.setUpTestData() 已弃用。

  • 在中使用布尔值 BaseCommand.requires_system_checks 已弃用。使用 '__all__' 而不是 True ,以及 [] (an空列表)而不是 False

  • 这个 whitelist 论据和 domain_whitelist 的属性 EmailValidator 都已被弃用。使用 allowlist 而不是 whitelist ,以及 domain_allowlist 而不是 domain_whitelist .您可能需要重命名 whitelist 在现有的移民中。

  • 这个 default_app_config 由于现在是自动的,应用程序配置变量已被弃用 AppConfig 的发现看到 Django 3.2中的新功能 了解更多详细信息。

  • 自动呼叫 repr() 在查询集上 TransactionTestCase.assertQuerysetEqual() ,与字符串值相比,已被弃用。如果您需要之前的行为,请显式设置 transformrepr

  • 这个 django.core.cache.backends.memcached.MemcachedCache 后台已被弃用为 python-memcached 有一些问题,似乎无法维护。使用 django.core.cache.backends.memcached.PyMemcacheCachedjango.core.cache.backends.memcached.PyLibMCCache 取而代之的是。

  • 使用的消息格式 django.contrib.messages.storage.cookie.CookieStorage 与Django旧版本生成的格式不同。对旧格式的支持将持续到Django 4.1。