Django 2.2发行说明

2019年4月1日

欢迎来到Django 2.2!

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

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

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

python兼容性

Django 2.2支持Python3.5、3.6、3.7、3.8(截至2.2.8)和3.9(截至2.2.17)。我们 强烈推荐 并且仅官方支持每个系列的最新版本。

Django 2.2的新功能

约束条件

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

次要特征

django.contrib.admin

django.contrib.auth

django.contrib.gis

django.contrib.postgres

django.contrib.staticfiles

数据库后端

通用视图

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

国际化

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

管理命令

迁徙

模型

  • 添加了对PostgreSQL运算符类的支持 (Index.opclasses

  • 添加了对部分索引的支持 (Index.condition

  • 增加了 NullIfReverse 数据库函数以及许多 math database functions .

  • 设置新 ignore_conflicts 参数 QuerySet.bulk_create()True 告诉数据库忽略插入唯一性约束或其他检查失败的行的失败。

  • 新的 ExtractIsoYear 函数从中提取ISO-8601周编号年份 DateFieldDateTimeField 和新的 iso_year 查找允许按ISO-8601周编号年份查询。

  • 新的 QuerySet.bulk_update() 方法允许有效地更新多个模型实例上的特定字段。

  • 当执行单个查询时,django不再总是启动事务,例如 Model.save()QuerySet.update()Model.delete() . 这通过减少数据库往返次数来提高自动提交的性能。

  • 为添加了sqlite支持 StdDevVariance 功能。

  • 处理 DISTINCT 聚合添加到 Aggregate 类。添加 allow_distinct = True 作为类属性 Aggregate 子类允许 distinct 要在初始化时指定的关键字参数,以确保仅对的每个不同值调用聚合函数 expressions .

  • 这个 RelatedManager.add()create()remove()set()get_or_create()update_or_create() 方法现在可以用于与中间模型的多对多关系。新的 through_defaults 参数用于指定新中间模型实例的值。

请求和响应

串行化

  • 现在可以使用包含 forward references 旁路 handle_forward_references=Trueserializers.deserialize() . 此外, loaddata 自动处理转发引用。

测验

  • 新的 SimpleTestCase.assertURLEqual() 断言检查给定的URL,忽略查询字符串的顺序。 assertRedirects() 使用新断言。

  • 测试 Client 现在支持列表和元组的自动JSON序列化 data 什么时候? content_type='application/json' .

  • 新的 ORACLE_MANAGED_FILES 测试数据库设置允许使用Oracle托管文件(OMF)表空间。

  • 可延迟的数据库约束现在在每个 TestCase 在sqlite 3.20+上测试,就像在支持可延迟约束的其他后端上一样。这些检查并没有为旧版本的sqlite实现,因为它们需要昂贵的表内省。

  • DiscoverRunner 现在跳过数据库的设置,而不是 referenced by tests .

URLs

验证器

2.2中的向后不兼容变化

数据库后端API

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

  • 第三方数据库后端必须实现对表检查约束或集合的支持 DatabaseFeatures.supports_table_check_constraintsFalse .

  • 第三方数据库后端必须实现对插入或设置时忽略约束或唯一性错误的支持 DatabaseFeatures.supports_ignore_conflictsFalse .

  • 第三方数据库后端必须对 DurationField 或设置 DatabaseFeatures.can_introspect_duration_fieldFalse .

  • DatabaseFeatures.uses_savepoints 现在默认为 True .

  • 第三方数据库后端必须实现对部分索引或集合的支持 DatabaseFeatures.supports_partial_indexesFalse .

  • DatabaseIntrospection.table_name_converter()column_name_converter() 被移除。第三方数据库后端可能需要改为实现 DatabaseIntrospection.identifier_converter() . 在这种情况下,约束命名为 DatabaseIntrospection.get_constraints() 返回值必须规范化为 identifier_converter() .

  • 索引的SQL生成从 IndexSchemaEditor 而这些 SchemaEditor 添加方法:

    • _create_primary_key_sql() and _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() and _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 is not cached. Where the problem can be detected (Python 3.6 and later), such usage now raises TypeError: Cannot assign the same cached_property to two different names ('base' and 'alias').

改为使用:

import operator


class A:
    ...

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

代理模型的权限

Permissions for proxy models 现在使用代理模型的内容类型而不是具体模型的内容类型创建。迁移将在运行时更新现有权限 migrate .

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

最后,必须更新代理模型权限字符串以使用它们自己的权限字符串 app_label . 例如,对于 app.MyProxyModel 继承 other_app.ConcreteModel 更新 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', ...] 什么时候? declaring form media assets .

其他

  • 为了提高可读性, UUIDField 表单域现在用破折号显示值,例如 550e8400-e29b-41d4-a716-446655440000 而不是 550e8400e29b41d4a716446655440000 .

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

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

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

  • 默认的截断字符 urlizetrunctruncatecharstruncatechars_htmltruncatewordstruncatewords_html 模板过滤器现在是真正的省略号字符 ( )而不是3个点。您可能需要调整一些测试输出比较。

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

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

  • 支持 cx_Oracle <6.0被移除。

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

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

  • 为了提供更多的语义查询数据, NullBooleanSelect 现在渲染 <option> 价值观 unknowntruefalse 而不是 123 . 为了向后兼容,旧值仍然被接受为数据。

  • Group.name max_length 从80个字符增加到150个字符。

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

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

  • 这个 ping_google 管理命令现在默认为 https 而不是 http 以获取网站地图的URL。如果您的站点使用http,请使用新的 ping_google --sitemap-uses-http 选择。如果您使用 django.contrib.sitemaps.ping_google 函数时,将新的 sitemap_uses_https 参数为 False

  • runserver 不再支持 pyinotify (由看守代替)。

  • 这个 AvgStdDevVariance 聚合函数现在返回 Decimal 而不是 float 当输入为 Decimal .

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

  • 在中提供一个整数 key 论证 cache.delete()cache.get() 现在提出 ValueError .

  • 一些语言的复数方程被改变了,因为包含了Transifex的最新版本。

    备注

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

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 被贬低。

  • 这个 FloatRangeField 中的模型和表单字段 django.contrib.postgres 不赞成使用新名称, DecimalRangeField ,以匹配基础 numrange 数据库中使用的数据类型。

  • 这个 FILE_CHARSET 设置已弃用。从Django3.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.databasesTestCase.databases . 这些新属性允许声明数据库依赖项,以防止对非默认数据库的意外查询在测试之间泄漏状态。以前的行为 allow_database_queries=Truemulti_db=True 可通过设置 databases='__all__' .