Django 2.2 发行说明 — Django 文档

来自菜鸟教程
Django/docs/3.1.x/releases/2.2
跳转至:导航、​搜索

Django 2.2 发行说明

2019 年 4 月 1 日

欢迎使用 Django 2.2!

这些发行说明涵盖了 新功能 ,以及从 Django 2.1 或更早版本升级时您需要注意的一些 向后不兼容更改 。 我们已经 开始了某些功能 的弃用过程。

如果您要更新现有项目,请参阅 将 Django 升级到更新版本 指南。

Django 2.2 被指定为 长期支持版本 。 它将在发布后至少三年内收到安全更新。 对之前的 LTS Django 1.11 的支持将于 2020 年 4 月结束。

Python兼容性

Django 2.2 支持 Python 3.5、3.6、3.7、3.8(从 2.2.8 开始)和 3.9(从 2.2.17 开始)。 我们【X3X】强烈推荐【X23X】,官方只支持各系列的最新版本。


Django 2.2 中的新功能

约束

新的 CheckConstraintUniqueConstraint 类允许添加自定义数据库约束。 使用 Meta.constraints 选项将约束添加到模型中。


小功能

django.contrib.admin


django.contrib.auth


django.contrib.gis


django.contrib.postgres


django.contrib.staticfiles

  • collectstatic --ignore 选项添加了路径匹配,以便可以使用像 /vendor/*.js 这样的模式。


数据库后端


通用视图

  • 新的 View.setup 钩子在调用 dispatch() 之前初始化视图属性。 它允许 mixins 设置实例属性以在子类中重用。


国际化

  • 添加了对亚美尼亚语的支持和翻译。


管理命令

  • 新的 --force-color 选项强制命令输出着色。
  • :djadmin:`inspectdb` 现在为 PostgreSQL 上的外部表创建模型。
  • inspectdb --include-views 现在为 Oracle 和 PostgreSQL 上的物化视图创建模型。
  • 新的 inspectdb --include-partitions 选项允许为 PostgreSQL 上的分区表创建模型。 在旧版本中,模型是创建子表而不是父表。
  • :djadmin:`inspectdb` 现在内省 DurationField 用于 Oracle 和 PostgreSQL,以及 AutoField 用于 SQLite。
  • 在 Oracle 上,:djadmin:`dbshell`rlwrap 包裹(如果可用)。 rlwrap 提供键盘输入的命令历史和编辑。
  • 新的 makemigrations --no-header 选项避免在生成的迁移文件中写入标题注释。 此选项也可用于 :djadmin:`squashmigrations`
  • :djadmin:`runserver` 现在可以使用 Watchman 来提高观看大量文件更改的性能。


迁移

  • 新的 migrate --plan 选项打印将执行的迁移操作列表。
  • NoneType 现在可以在迁移中序列化。
  • 您现在可以 注册自定义序列化程序 以进行迁移。


型号

  • 添加了对 PostgreSQL 运算符类的支持 (Index.opclasses)。
  • 添加了对部分索引的支持 (Index.condition)。
  • 添加了NullIfReverse数据库函数,以及许多数学数据库函数
  • QuerySet.bulk_create() 的新 ignore_conflicts 参数设置为 True 告诉数据库忽略插入未通过唯一性约束或其他检查的行的失败。
  • 新的 ExtractIsoYear 函数从 DateFieldDateTimeField 中提取 ISO-8601 周编号年份,以及新的 :lookup:`iso_year`查找允许按 ISO-8601 周编号年份查询。
  • 新的 QuerySet.bulk_update() 方法允许有效地更新多个模型实例上的特定字段。
  • Django 不再总是在执行单个查询时启动事务,例如 Model.save()QuerySet.update()Model.delete()。 这通过减少数据库往返次数来提高自动提交的性能。
  • 添加了对 StdDevVariance 函数的 SQLite 支持。
  • DISTINCT 聚合的处理添加到 Aggregate 类。 添加 allow_distinct = True 作为 Aggregate 子类的类属性允许在初始化时指定 distinct 关键字参数,以确保只为每个不同的值调用聚合函数expressions
  • RelatedManager.add()create()remove()set()get_or_create()、和 update_or_create() 方法现在允许用于与中间模型的多对多关系。 新的 through_defaults 参数用于指定新的中间模型实例的值。


请求和响应


序列化

  • 您现在可以通过将 handle_forward_references=True 传递给 serializers.deserialize(),使用包含 前向引用 的自然键反序列化数据。 此外,:djadmin:`loaddata` 自动处理前向引用。


测试

  • 新的 SimpleTestCase.assertURLEqual() 断言检查给定的 URL,忽略查询字符串的顺序。 assertRedirects() 使用新的断言。
  • 测试 Client 现在支持 content_type='application/json' 时列表和元组 data 的自动 JSON 序列化。
  • 新的 :设置:`ORACLE_MANAGED_FILES ` 测试数据库设置允许使用 Oracle Managed Files (OMF) 表空间。
  • 现在在 SQLite 3.20+ 上的每个 TestCase 测试结束时检查可延迟数据库约束,就像在其他支持可延迟约束的后端上一样。 旧版本的 SQLite 没有实现这些检查,因为它们需要在那里进行昂贵的表内省。
  • DiscoverRunner 现在跳过不是由测试 引用的 数据库的设置。


网址


验证器


2.2 中向后不兼容的变化

数据库后端API

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

  • 第三方数据库后端必须实现对表检查约束的支持或将 DatabaseFeatures.supports_table_check_constraints 设置为 False
  • 第三方数据库后端必须支持在插入或将 DatabaseFeatures.supports_ignore_conflicts 设置为 False 时忽略约束或唯一性错误。
  • 第三方数据库后端必须对 DurationField 进行自省或将 DatabaseFeatures.can_introspect_duration_field 设置为 False
  • DatabaseFeatures.uses_savepoints 现在默认为 True
  • 第三方数据库后端必须实现对部分索引的支持或将 DatabaseFeatures.supports_partial_indexes 设置为 False
  • DatabaseIntrospection.table_name_converter()column_name_converter() 被移除。 第三方数据库后端可能需要实现 DatabaseIntrospection.identifier_converter()。 在这种情况下,DatabaseIntrospection.get_constraints() 返回的约束名称必须由 identifier_converter() 规范化。
  • 索引的 SQL 生成从 Index 移动到 SchemaEditor,并添加了这些 SchemaEditor 方法:
    • _create_primary_key_sql()_delete_primary_key_sql()
    • _delete_index_sql()(与 _create_index_sql() 配对)
    • _delete_unique_sql(与 _create_unique_sql() 配对)
    • _delete_fk_sql()(与 _create_fk_sql() 配对)
    • _create_check_sql()_delete_check_sql()
  • DatabaseWrapper.__init__()allow_thread_sharing的第三个参数被删除。


不再从基本 ModelAdmin 类中收集管理操作

例如,在旧版本的 Django 中:

from django.contrib import admin

class BaseAdmin(admin.ModelAdmin):
    actions = ['a']

class SubAdmin(BaseAdmin):
    actions = ['b']

SubAdmin 会有动作 'a''b'

现在 actions 遵循标准的 Python 继承。 要获得与之前相同的结果:

class SubAdmin(BaseAdmin):
    actions = BaseAdmin.actions + ['b']

django.contrib.gis

  • 不再支持 GDAL 1.9 和 1.10。


TransactionTestCase 序列化数据加载

现在,在测试结束时,数据库刷新后,初始数据迁移会加载到 TransactionTestCase 中。 在旧版本中,这些数据是在测试开始时加载的,但这会阻止 test --keepdb 选项正常工作(整个测试套件结束时数据库为空)。 除非您已自定义 TransactionTestCase 的内部结构,否则此更改不应影响您的测试。


sqlparse 是必需的依赖项

为了简化 Django 数据库处理的几个部分,sqlparse 0.2.2+ 现在是必需的依赖项。 它与 Django 一起自动安装。


cached_property 别名

在使用中如:

from django.utils.functional import cached_property

class A:

    @cached_property
    def base(self):
        return ...

    alias = base

alias 不缓存。 在可以检测到问题的地方(Python 3.6 及更高版本),这种用法现在会引发 TypeError: Cannot assign the same cached_property to two different names ('base' and 'alias').

改用这个:

import operator

class A:

    ...

    alias = property(operator.attrgetter('base'))

代理模型的权限

代理模型的权限现在使用代理模型的内容类型而不是具体模型的内容类型创建。 当您运行 :djadmin:`migrate` 时,迁移将更新现有权限。

在管理员中,更改对于具有与其具体模型相同的 app_label 的代理模型是透明的。 但是,在旧版本中,具有 app_label 与其具体模型不同的代理模型权限的用户无法在管理员中访问该模型。 现在已修复,但您可能希望在升级之前审核此类代理模型 ([add|view|change|delete]_myproxy) 的权限分配,以确保新访问权限合适。

最后,必须更新代理模型权限字符串以使用它们自己的 app_label。 例如,对于继承自 other_app.ConcreteModelapp.MyProxyModel,将 user.has_perm('other_app.add_myproxymodel') 更新为 user.has_perm('app.add_myproxymodel')


合并表格 Media 资产

表格 Media 资产现在使用拓扑排序算法合并,因为旧的成对合并算法在某些情况下是不够的。 不包含其依赖项的 CSS 和 JavaScript 文件现在可能会被错误地排序(旧算法巧合地正确生成结果)。

审核所有 Media 类是否有任何缺失的依赖项。 例如,依赖于 django.jQuery 的小部件在 声明表单媒体资产 时必须指定 js=['admin/js/jquery.init.js', ...]


杂项

  • 为了提高可读性,UUIDField 表单字段现在显示带破折号的值,例如 550e8400-e29b-41d4-a716-446655440000 代替 550e8400e29b41d4a716446655440000

  • 在 SQLite 上,PositiveIntegerFieldPositiveSmallIntegerField 现在包含检查约束以防止数据库中出现负值。 如果您有现有的无效数据并运行重新创建表的迁移,您将看到 CHECK constraint failed

  • 为了与 WSGI 服务器保持一致,测试客户端现在将 Content-Length 标头设置为字符串而不是整数。

  • django.utils.text.slugify() 的返回值不再标记为 HTML 安全。

  • :tfilter:`urlizetrunc`, :tfilter:`truncatechars`, :tfilter:`truncatechars_html`, 使用的默认截断字符: tfilter:`truncatewords`:tfilter:`truncatewords_html` 模板过滤器现在是真正的省略号字符 () 而不是 3 个点。 您可能需要调整一些测试输出比较。

  • 删除了模板文件系统加载器中对字节串路径的支持。

  • django.utils.http.urlsafe_base64_encode() 现在返回一个字符串而不是字节串,并且 django.utils.http.urlsafe_base64_decode() 可能不再传递一个字节串。

  • 支持cx_Oracle < 6.0 被删除。

  • mysqlclient的最低支持版本从1.3.7增加到1.3.13。

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

  • 为了提供更多语义查询数据,NullBooleanSelect 现在呈现 unknowntruefalse<option> 值而不是 [ X140X]、23。 为了向后兼容,旧值仍被接受为数据。

  • Group.name max_length is increased from 80 to 150 characters.

  • 违反可延迟数据库约束的测试现在在 SQLite 3.20+ 上运行时会出错,就像在支持此类约束的其他后端上一样。

  • 为了捕捉使用错误,如果 None 作为值传递,测试 Clientdjango.utils.http.urlencode() 现在提高 TypeError编码,因为 None 无法在 GET 和 POST 数据中编码。 传递一个空字符串或省略该值。

  • :djadmin:`ping_google` 管理命令现在默认为 https 而不是 http 作为站点地图的 URL。 如果您的站点使用 http,请使用新的 ping_google --sitemap-uses-http 选项。 如果您使用 ping_google() 函数,请将新的 sitemap_uses_https 参数设置为 False

  • :djadmin:`runserver` 不再支持 pyinotify(被 Watchman 取代)。

  • 当输入为 AvgStdDevVariance 聚合函数现在返回 Decimal 而不是 float X141X]。

  • 如果没有迁移的应用程序与有迁移的应用程序有关系,则 SQLite 上的测试将失败。 自从在 Django 1.7 中添加迁移以来,这一直是一个记录在案的限制,但现在它更可靠地失败了。 您会看到测试失败并出现 no such table: <app_label>_<model> 之类的错误。 这在几个第三方应用程序中观察到,这些应用程序在测试中没有迁移模型。 您必须为此类模型添加迁移。

  • cache.delete()cache.get()key 参数中提供一个整数现在会引发 ValueError

  • 某些语言的复数方程已更改,因为包含 Transifex 的最新版本。

    笔记

    在 Django 2.2.12 中添加了处理包含相同语言的不同复数方程的 .po 文件的能力。


2.2 中弃用的功能

模型 Meta.ordering 将不再影响 GROUP BY 查询

模型的 Meta.ordering 影响 GROUP BY 查询(例如 .annotate().values())是混淆的常见来源。 此类查询现在会发出弃用警告,并建议添加 order_by() 以保留当前查询。 Meta.ordering 在 Django 3.1 开始的此类查询中将被忽略。


杂项

  • django.utils.timezone.FixedOffset 已弃用,取而代之的是 datetime.timezone
  • 未记录的 QuerySetPaginator 别名 django.core.paginator.Paginator 已弃用。
  • django.contrib.postgres 中的 FloatRangeField 模型和表单字段已弃用,取而代之的是新名称 DecimalRangeField,以匹配数据库中使用的底层 numrange 数据类型.
  • FILE_CHARSET 设置已弃用。 从 Django 3.1 开始,从磁盘读取的文件必须是 UTF-8 编码。
  • django.contrib.staticfiles.storage.CachedStaticFilesStorage 由于存在难以处理的问题而被弃用。 改用 ManifestStaticFilesStorage 或第三方云存储。
  • RemoteUserBackend.configure_user() 现在通过 request 作为第一个位置参数,如果它接受它。 对不接受的覆盖的支持将在 Django 3.1 中删除。
  • SimpleTestCase.allow_database_queriesTransactionTestCase.multi_dbTestCase.multi_db 属性被弃用,取而代之的是 SimpleTestCase.databasesTransactionTestCase.databases 和 X157X]TestCase.databases。 这些新属性允许声明数据库依赖项,以防止针对非默认数据库的意外查询在测试之间泄漏状态。 之前的allow_database_queries=Truemulti_db=True的行为可以通过设置databases='__all__'来实现。