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月结束。
Django 3.2支持Python3.6、3.7、3.8、3.9和3.10(从3.2.9开始)。我们 highly recommend 并且仅官方支持每个系列的最新版本。
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_FIELD 是 AutoField .从3.2个新项目开始 DEFAULT_AUTO_FIELD 设置为 BigAutoField .此外,新应用程序是通过以下方式生成的 AppConfig.default_auto_field 设置为 BigAutoField .未来Django会发布默认值 DEFAULT_AUTO_FIELD 将变更为 BigAutoField 。
为了避免将来不必要的迁移,要么显式设置 DEFAULT_AUTO_FIELD 至 AutoField **
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_display 或 readonly_fields 。
同样,新的 action() 装饰器允许轻松地向可与之一起使用的动作功能添加选项 actions 。
使用 @display 装饰者的优点是现在可以使用 @property 当需要在自定义方法上指定属性时,装饰器。在此之前,有必要使用 property() 在将所需的属性分配给方法后,改为函数。
使用装饰器的优点是,这些选项更容易处理,因为可以由代码编辑器中的完成实用程序建议它们。它们只是一种便利,并且仍然为引擎盖下的功能设置了相同的属性。
django.contrib.admin¶ModelAdmin.search_fields 现在允许搜索带有空白的引用短语。
如果目标模型已在管理员中注册,只读相关字段现在将呈现为可导航链接。
管理员现在支持主题化,并包括根据浏览器设置启用的黑暗主题。看到 主题支持 了解更多详细信息。
ModelAdmin.autocomplete_fields 现在尊重 ForeignKey.to_field 和 ForeignKey.limit_choices_to 搜索相关模型时。
管理员现在安装一个最终的全部捕获视图,该视图将未经身份验证的用户重定向到登录页面,而不考虑URL是否有效。这可以防止潜在的模型枚举隐私问题。
虽然不建议,但您可以设置新的 AdminSite.final_catch_all_view 至 False 禁用全面视图。
django.contrib.auth¶PBKDF 2密码哈希器的默认迭代计数从216,000增加到260,000。
Argon 2密码哈希器的默认变体更改为Argon 2id。 memory_cost 和 parallelism 分别增加到102,400和8,以匹配 argon2-cffi 默认值。
增加 memory_cost 将所需内存从512 KB推到100 MB。这仍然相当保守,但可能会在内存受限的环境中导致问题。如果是这种情况,可以对现有哈希器进行子分类以覆盖默认设置。
Argon 2、MD5、PBKDF 2、SHA-1密码哈希器的默认盐量从71位增加到128位。
django.contrib.contenttypes¶新的 absolute_max 论据 generic_inlineformset_factory() 允许自定义在提供时可以实例化的最大数量的表单 POST 数据看到 限制实例化表单的最大数量 了解更多详细信息。
新的 can_delete_extra 论据 generic_inlineformset_factory() 允许删除删除额外表格的选项。看到 can_delete_extra 以获取更多信息。
django.contrib.gis¶这个 GDALRaster.transform() 方法现在支持 SpatialReference 。
这个 DataSource 类现在支持 pathlib.Path 。
这个 LayerMapping 类现在支持 pathlib.Path 。
django.contrib.postgres¶新的 ExclusionConstraint.include 属性允许在PostgreSQL 12+上创建覆盖排除约束。
新的 ExclusionConstraint.opclasses 属性允许设置PostgreSQL运算符类。
新 JSONBAgg.ordering 属性确定聚合元素的顺序。
新的 JSONBAgg.distinct 属性确定聚合值是否不同。
这个 CreateExtension 操作现在检查该扩展是否已存在于数据库中,如果存在,则跳过迁移。
新的 CreateCollation 和 RemoveCollation 操作允许在PostgreSQL上创建和删除排序规则。看到 使用迁移管理排序规则 了解更多详细信息。
查找 ArrayField 现在允许包含运算式的(非嵌套)数组作为右侧。
新的 OpClass() express允许使用自定义运算符类在express上创建函数索引。看到 函数索引 了解更多详细信息。
django.contrib.sitemaps¶新的 Sitemap 属性 alternates , languages 和 x_default 允许生成网站地图 alternates 到您页面的本地化版本。
第三方数据库后台现在可以使用新的跳过Django测试套件中的预期失败测试或标记为预期失败测试 DatabaseFeatures.django_test_skips 和 django_test_expected_failures 属性。
新的 no_append_slash() 装饰器允许将单个视图排除在外 APPEND_SLASH URL规范化。
自定义 ExceptionReporter 子类现在可以定义 html_template_path 和 text_template_path 属性来重写用于呈现异常报告的模板。
新的 FileUploadHandler.upload_interrupted() 回调允许处理中断的上传。
新的 absolute_max 论据 formset_factory() , inlineformset_factory() ,以及 modelformset_factory() 允许自定义在提供时可以实例化的最大数量的表单 POST 数据看到 限制实例化表单的最大数量 了解更多详细信息。
新的 can_delete_extra 论据 formset_factory() , inlineformset_factory() ,以及 modelformset_factory() 允许删除删除额外表格的选项。看到 can_delete_extra 以获取更多信息。
BaseFormSet 现在,当管理表单丢失或被篡改时,会报告用户面临错误,而不是引发异常。要自定义此错误消息,请传递 error_messages 用钥匙争论 'missing_management_form' 实例化表单集时。
这个 week_format 的属性 WeekMixin 和 WeekArchiveView 现在支持 '%V' ISO 8601周格式。
loaddata 现在支持存储在XZ档案中的固定装置 (.xz )和LZMA档案 (.lzma )。
dumpdata 现在可以在 bz2 , gz , lzma ,或 xz 格式。
makemigrations 现在可以在没有活动数据库连接的情况下调用。在这种情况下,将跳过检查一致的迁移历史记录。
BaseCommand.requires_system_checks 现在支持指定标签列表。在执行命令之前,将检查所选标签中注册的系统检查是否存在错误。在早期版本中,要么执行所有系统检查,要么不执行任何系统检查。
更新了Windows上对彩色终端输出的支持。自动检测各种现代终端环境,并改进了在其他情况下启用支持的选项。看到 语法颜色标记 了解更多详细信息。
新的 Operation.migration_name_fragment 属性允许提供文件名片段,该片段将用于命名仅包含该操作的迁移。
迁移现在支持从 pathlib ,以及 os.PathLike 实例。
新的 no_key 的参数 QuerySet.select_for_update() ,在PostgreSQL上支持,允许获取较弱的锁,不会阻止创建通过新元素引用锁定行的行。
When() 表达现在允许使用 condition 论点与 lookups 。
新的 Index.include 和 UniqueConstraint.include 属性允许创建覆盖索引并覆盖PostgreSQL 11+上的唯一约束。
新的 UniqueConstraint.opclasses 属性允许设置PostgreSQL运算符类。
这个 QuerySet.update() 方法现在尊重 order_by() SQL和MariaDB上的条款。
FilteredRelation() 现在支持嵌套关系。
这个 of 的论点 QuerySet.select_for_update() 现在允许在MySQL 8.0.1+上使用。
Value() 表达现在自动解析其 output_field 到适当的 Field 基于所提供的类型的子类别 value 为 bool , bytes , float , int , str , datetime.date , datetime.datetime , datetime.time , datetime.timedelta , decimal.Decimal ,以及 uuid.UUID 实例.因此,解决了一个 output_field 对于数据库函数和组合表达,使用混合类型时可能会崩溃 Value() .您需要显式设置 output_field 在这种情况下。
新的 QuerySet.alias() 方法允许为不需要选择但用于过滤、排序或作为复杂表达的一部分的表达创建可重复使用的别名。
新的 Collate 函数允许通过指定的数据库排序来过滤和排序。
这个 field_name 的论点 QuerySet.in_bulk() 现在,如果中仅指定了一个字段,则接受不同的字段 QuerySet.distinct() 。
添加了 Random 数据库功能。
聚合函数 , F() , OuterRef() ,和其他表达现在允许使用变换。看到 公式可以引用转换 了解更多细节。
新的 durable 论据 atomic() 确保如果原子块无错误退出,则将提交原子块中所做的更改。标记为持久的嵌套原子块将引发 RuntimeError 。
添加了 JSONObject 数据库功能。
新的 django.core.paginator.Paginator.get_elided_page_range() 方法允许生成省略了一些值的页面范围。如果有大量页面,这有助于在模板中生成合理数量的页面链接。
响应标头现在存储在 HttpResponse.headers .这可以用来代替原来的类似于dict的界面 HttpResponse 对象这两个界面都将继续受到支持。看到 设置标题字段 了解更多细节。
新的 headers 的参数 HttpResponse , SimpleTemplateResponse ,以及 TemplateResponse 允许设置响应 headers 关于实例化。
这个 SECRET_KEY 现在,在首次访问时检查设置是否有有效值,而不是在首次加载设置时检查设置。这使得运行不依赖于 SECRET_KEY 无需提供价值。因此,呼叫 configure() 未提供有效的 SECRET_KEY ,然后继续访问 settings.SECRET_KEY 现在将筹集 ImproperlyConfigured 例外。
新的 Signer.sign_object() 和 Signer.unsign_object() 方法允许签署复杂的数据结构。看到 保护复杂的数据结构 了解更多详细信息。
另外, signing.dumps() 和 loads() 成为 TimestampSigner.sign_object() 和 unsign_object() 。
Signal.send_robust() 现在记录异常。
floatformat 模板筛选器现在允许使用 g 后缀强制按 THOUSAND_SEPARATOR 对于活动区域。
缓存的模板 Cached template loaders 现在已在开发中正确重新加载。
中指定给类属性的对象 TestCase.setUpTestData() 现在针对每种测试方法进行隔离。现在需要此类对象支持创建深副本 copy.deepcopy() .删除不支持的对象 deepcopy() 已被弃用并将在Django 4.1中删除。
DiscoverRunner 现在使 faulthandler 在默认情况下可以通过使用 test --no-faulthandler 选择。
DiscoverRunner 以及 test 管理命令现在可以跟踪时间,包括数据库设置和总运行时间。这可以通过使用 test --timing 选择。
Client 现在在遵循307和308重定向时保留请求查询字符串。
新的 TestCase.captureOnCommitCallbacks() 方法捕获传递给 transaction.on_commit() 在列表中。这使您可以测试此类回调,而无需使用较慢的回调 TransactionTestCase 。
TransactionTestCase.assertQuerysetEqual() 属性的默认值时,现在支持与另一个查询集进行直接比较,而不限于与对象的字符串表示形式列表进行比较 transform 争论。
新的 depth 的参数 django.utils.timesince.timesince() 和 django.utils.timesince.timeuntil() 函数允许指定要返回的相邻时间单位的数量。
内置验证器现在将提供的值包括在 params 提出的论点 ValidationError .这允许自定义错误消息使用 %(value)s 占位符.
这个 ValidationError 相等运算符现在忽略 messages 和 params 订购。
本节描述第三方数据库后端可能需要的更改。
新的 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_indexes 至 True 。
第三方数据库后台必须对列数据库排序规则实施支持 CharField s和 TextField s或设置 DatabaseFeatures.supports_collation_on_charfield 和 DatabaseFeatures.supports_collation_on_textfield 至 False .如果不支持非确定性排序,请设置 supports_non_deterministic_collations 至 False 。
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_indexes 至 False 。如果 COLLATE 不是 CREATE INDEX 陈述,集 DatabaseFeatures.collate_as_index_expression 至 True 。
django.contrib.admin¶管理员中的翻页链接现在是1-索引而不是0-索引,即第一页的查询字符串是 ?p=1 而不是 ?p=0 。
新的管理员全面查看将打破在管理员URL之后路由并匹配管理员URL前置的URL模式。您可以调整URL顺序,或者在必要时设置 AdminSite.final_catch_all_view 至 False ,禁用全面视图。看到 Django 3.2中的新功能 了解更多详细信息。
管理员不再包含迷你化的JavaScript文件。如果您需要缩小这些文件,请考虑使用第三方应用程序或外部构建工具。与管理员一起打包的缩小版供应的JavaScript文件(例如 jquery.min.js )仍然包括在内。
ModelAdmin.prepopulated_fields 不再删除英语停止词,例如 'a' 或 'an' 。
django.contrib.gis¶已删除对PostGIS 2.2的支持。
Oracle后台现在会克隆多边形(以及包含多边形的几何集合),然后重新调整多边形并将其保存到数据库。它们不再原地突变。如果您在保存模型后使用多边形,您可能会注意到这一点。
对PostgreSQL 9.5的上游支持将于2021年2月结束。Django 3.2支持PostgreSQL 9.6及更高版本。
对SQL 5.6的上游支持将于2021年4月结束。Django 3.2支持SQL 5.7及更高版本。
Django现在支持非“pytz”时区,例如Python 3.9+的 zoneinfo 模块及其后台。
未登记的人 SpatiaLiteOperations.proj4_version() 方法被重命名为 proj_version() 。
slugify() 现在删除前破折号和尾随破折号以及强调线。
支持 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 = False 在 AppConfig 如果您需要防止这种行为,则可以使用子类。看到 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。
删除不支持创建深副本的对象 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() ,与字符串值相比,已被弃用。如果您需要之前的行为,请显式设置 transform 至 repr 。
这个 django.core.cache.backends.memcached.MemcachedCache 后台已被弃用为 python-memcached 有一些问题,似乎无法维护。使用 django.core.cache.backends.memcached.PyMemcacheCache 或 django.core.cache.backends.memcached.PyLibMCCache 取而代之的是。
使用的消息格式 django.contrib.messages.storage.cookie.CookieStorage 与Django旧版本生成的格式不同。对旧格式的支持将持续到Django 4.1。
5月 28, 2025