django3.0发行说明

2019年12月2日

欢迎来到Django 3.0!

这些发行说明涵盖了 new features 以及一些 backwards incompatible changes 从Django 2.2或更早版本升级时,您需要注意。我们已经 dropped some features 已经到了他们的折旧周期结束,我们已经 begun the deprecation process for some features .

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

python兼容性

Django 3.0支持Python3.6、3.7、3.8和3.9(从3.0.11开始)。我们 强烈推荐 并且仅官方支持每个系列的最新版本。

django 2.2.x系列是最后一个支持python 3.5的系列。

第三方库支持旧版本的Django

在Django3.0发布之后,我们建议第三方应用程序作者放弃对2.2之前所有版本的Django的支持。那时,您应该能够使用 python -Wd 这样就会出现反预测警告。在修复了拒绝警告之后,您的应用程序应该与Django3.0兼容。

Django 3.0的新功能

MariaDB支持

Django现在正式支持 MariaDB 10.1及以上。看到了吗 MariaDB notes 了解更多详细信息。

ASGI支持

django3.0通过提供对作为 ASGI 应用。

这是对我们现有的WSGI支持的补充。Django打算在可预见的将来支持这两个项目。不过,异步特性只对在ASGI下运行的应用程序可用。

在这个阶段,异步支持只适用于外部ASGI应用程序。内部一切都保持同步。异步中间件、视图等尚不受支持。但是,您可以在Django的应用程序中使用ASGI中间件,允许您将Django与其他ASGI框架结合起来。

除非您想开始尝试异步代码,否则不需要切换应用程序,但是我们已经做到了 documentation on deploying with ASGI 如果你想了解更多。

注意,作为此更改的副作用,Django现在意识到异步事件循环,并将阻止您从异步上下文调用标记为“异步不安全”的代码(如ORM操作)。如果您以前使用的是异步代码中的Django,如果操作不正确,则可能会触发此问题。如果你看到 SynchronousOnlyOperation 仔细检查同步数据库中的任何错误,然后将其移动到数据库中的任何错误。

PostgreSQL的排除约束

新的 ExclusionConstraint 类允许在PostgreSQL上添加排除约束。使用将约束添加到模型中 Meta.constraints 选择权。

筛选表达式

输出的表达式 BooleanField 现在可以直接用于 QuerySet 过滤器,而不必首先注释,然后根据注释进行过滤。

模型字段选择的枚举

自定义枚举类型 TextChoicesIntegerChoicesChoices 现在可以用来定义 Field.choices . TextChoicesIntegerChoices 为文本和整数字段提供类型。这个 Choices 类允许为其他具体数据类型定义兼容的枚举。这些自定义枚举类型支持人类可读的标签,这些标签可以通过枚举或其成员上的属性进行转换和访问。看到了吗 Enumeration types 更多细节和例子。

次要特征

django.contrib.admin

django.contrib.auth

django.contrib.gis

django.contrib.postgres

django.contrib.sessions

django.contrib.syndication

隐藏物

文件存储

形式

国际化

登录中

  • 新的 reporter_class 参数 AdminEmailHandler 允许提供 django.views.debug.ExceptionReporter 子类自定义发送到站点的回溯文本 ADMINS 什么时候? DEBUGFalse .

管理命令

模型

  • 添加了哈希数据库函数 MD5SHA1SHA224SHA256SHA384SHA512 .

  • 增加了 Sign 数据库函数。

  • 新的 is_dst 的参数 Trunc 数据库函数确定不存在和不明确日期时间的处理方式。

  • connection.queries 现在显示 COPY TO PostgreSQL上的语句。

  • FilePathField 现在接受一个 path .

  • 允许的自引用对称中间表 ManyToManyField .

  • 这个 name 属性 CheckConstraintUniqueConstraintIndex 现在使用 '%(app_label)s''%(class)s' 占位符。

  • 新的 Field.descriptor_class 属性允许模型字段通过重写 descriptors .

  • AvgSum 现在支持 distinct 争论。

  • 补充 SmallAutoField 就像一个 AutoField 但它只允许在某个(依赖于数据库的)限制下使用值。值来自 132767 在Django支持的所有数据库中都是安全的。

  • AutoFieldBigAutoFieldSmallAutoField 现在继承自 IntegerFieldBigIntegerFieldSmallIntegerField 分别。系统检查和验证器现在也被正确地继承了。

  • FileField.upload_to 现在支持 pathlib.Path .

  • CheckConstraint 现在MySQL8.0.16+支持。

  • 新的 allows_group_by_selected_pks_on_model() 方法 django.db.backends.base.BaseDatabaseFeatures 允许优化 GROUP BY 子句只需要选定模型的主键。默认情况下,它只支持PostgreSQL上的托管模型。

    启用 GROUP BY 只有主键优化对于非托管模型,您必须子类化PostgreSQL数据库引擎,重写features类 allows_group_by_selected_pks_on_model() 你需要的方法。看到了吗 Subclassing the built-in database backends 举个例子。

请求和响应

安全性

测验

  • 新测试 Client 论点 raise_request_exception 允许控制在请求期间引发的异常是否也应在测试中引发。值默认为 True 为了向后兼容。如果是 False 出现异常时,测试客户机将返回一个具有属性的500响应 exc_info ,提供发生异常的信息的元组。

  • 可以使用新的测试名称模式选择要运行的测试和测试用例 test -k 选择权。

  • HTML比较,如 assertHTMLEqual() ,现在将引用同一字符的文本、字符引用和实体引用视为等效。

  • Django test runner现在支持在受支持的浏览器上进行selenium测试的headless模式。添加 --headless 启用此模式的选项。

  • Django测试运行程序现在支持 --start-at--start-after 从特定顶层模块开始运行测试的选项。

  • Django测试运行程序现在支持 --pdb 选项在每次错误或失败时生成调试器。

3.0中的向后不兼容更改

Model.save() 为主键提供默认值时

Model.save() 在保存新的 Model 实例和主键的默认值,并始终执行单个 INSERT 查询。在旧的Django版本中, Model.save() 执行 INSERTUPDATE 基于行是否存在。

这就叫打电话了 Model.save() 同时提供一个默认的主键值,相当于传递 force_insert=True 到模特的 save() . 尝试使用新的 Model 将更新现有行 IntegrityError .

为了更新特定主键值的现有模型,请使用 update_or_create() 方法或 QuerySet.filter(pk=…).update(…) 取而代之的是。例如:

>>> MyModel.objects.update_or_create(pk=existing_pk, defaults={"name": "new name"})
>>> MyModel.objects.filter(pk=existing_pk).update(name="new name")

数据库后端API

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

  • 第二个论点 DatabaseIntrospection.get_geometry_type() 现在是行描述而不是列名称。

  • DatabaseIntrospection.get_field_type() 可能不再返回元组。

  • 如果数据库可以在添加字段的同一SQL语句中创建外键,请添加 SchemaEditor.sql_create_column_inline_fk 使用适当的SQL;否则,设置 DatabaseFeatures.can_create_inline_fk = False .

  • DatabaseFeatures.can_return_id_from_insertcan_return_ids_from_bulk_insert 重命名为 can_return_columns_from_insertcan_return_rows_from_bulk_insert .

  • 数据库函数现在处理 datetime.timezone 创建格式时使用 datetime.timedelta 实例(例如。 timezone(timedelta(hours=5)) ,它将输出 'UTC+05:00' ). 准备此格式时第三方应处理此格式 DateTimeField 在里面 datetime_cast_date_sql()datetime_extract_sql() 等。

  • 的条目 AutoFieldBigAutoFieldSmallAutoField 被添加到 DatabaseOperations.integer_field_ranges 支持这些字段类型的整数范围验证器。第三方后端可能需要自定义默认条目。

  • DatabaseOperations.fetch_returned_insert_id() 被替换 fetch_returned_insert_columns() 返回由 INSERT RETURNING 语句,而不是单个值。

  • DatabaseOperations.return_insert_id() 被替换 return_insert_columns() 接受 fields 参数,它是插入后返回的字段的iterable。通常这只是自动生成的主键。

django.contrib.admin

  • 管理员的模型历史更改消息现在更倾向于可读性更强的字段标签,而不是字段名称。

django.contrib.gis

  • 拆下PostGIS 2.1的支架。

  • 拆下了对Spatialite 4.1和4.2的支持。

  • 移除GDAL 1.11和GEOS 3.4的支架。

放弃了对PostgreSQL 9.4的支持

PostgreSQL 9.4的上游支持将于2019年12月结束。Django3.0支持PostgreSQL 9.5及更高版本。

放弃对Oracle 12.1的支持

Oracle 12.1的上游支持将于2021年7月结束。Django 2.2将得到支持,直到2022年4月。Django3.0正式支持Oracle12.2和18c。

删除了私有的python 2兼容性API

虽然在Django2.0中删除了对python 2的支持,但一些私有API没有从Django中删除,因此第三方应用程序可以继续使用它们,直到python 2生命周期结束。

由于我们期望应用程序在添加对Django3.0的支持时会降低python 2的兼容性,所以现在我们将删除这些API。

  • django.test.utils.str_prefix() -在python 3中,字符串没有“u”前缀。

  • django.test.utils.patch_logger() -使用 unittest.TestCase.assertLogs() 相反。

  • django.utils.lru_cache.lru_cache() - Alias functools.lru_cache() .

  • django.utils.decorators.available_attrs() -此函数返回 functools.WRAPPER_ASSIGNMENTS .

  • django.utils.decorators.ContextDecorator - Alias contextlib.ContextDecorator .

  • django.utils._os.abspathu() - Alias os.path.abspath() .

  • django.utils._os.upath()npath() -这些函数在Python3上不起作用。

  • django.utils.six -删除对此提供的库的使用或切换到 six

  • django.utils.encoding.python_2_unicode_compatible() - Alias six.python_2_unicode_compatible() .

  • django.utils.functional.curry() -使用 functools.partial()functools.partialmethod 。看见 5b1c389603a353625ae1603ba345147356336afb

  • django.utils.safestring.SafeBytes -自Django 2.0以来未使用。

的新默认值 FILE_UPLOAD_PERMISSIONS 设置

在旧版本中, FILE_UPLOAD_PERMISSIONS 设置默认为 None . 默认 FILE_UPLOAD_HANDLERS ,这将导致上载的文件根据其大小和使用的上载处理程序具有不同的权限。

FILE_UPLOAD_PERMISSIONS 现在默认为 0o644 为了避免这种不一致。

安全设置的新默认值

为了使Django项目在默认情况下更安全,一些安全设置现在具有更安全的默认值:

有什么新鲜事 Security section 有关这些更改的更多详细信息。

其他

  • ContentType.__str__() 现在包括模型的 app_label 消除不同应用中同名模型的歧义。

  • 因为不赞成在会话中而不是在cookie中访问语言, LocaleMiddleware 不再在会话中查找用户的语言 django.contrib.auth.logout() 注销后不再保留会话的语言。

  • django.utils.html.escape() 现在使用 html.escape() 转义HTML。这转换了 '' 而不是以前等效的十进制代码 ' .

  • 这个 django-admin test -k 选项现在作为 unittest -k 而不是作为 --keepdb .

  • 支持 pywatchman <1.2.0被删除。

  • urlencode() 现在对iterable值进行编码 doseq=False ,而不是迭代它们,使其与标准库保持一致 urllib.parse.urlencode() 功能。

  • intword 模板过滤器现在转换 1.0 作为单数短语,所有其他数值作为复数。这对于某些语言可能不正确。

  • 将值赋给模型的 ForeignKeyOneToOneField '_id' 属性现在取消设置相应的字段。之后访问该字段将导致查询。

  • patch_vary_headers() 现在处理一个星号 '*' 根据 RFC 7231#section-7.1.4 ,即,如果标题字段名列表包含星号,则 Vary 标题将由一个星号组成 '*' .

  • 在MySQL8.0.16+上, PositiveIntegerFieldPositiveSmallIntegerField 现在包含一个check约束来防止数据库中出现负值。

  • alias=None 添加到的签名中 Expression.get_group_by_cols() .

  • RegexPattern ,使用人 re_path() ,不再返回关键字参数 None 要传递给缺少的可选命名组的视图的值。

3.0中不推荐的功能

django.utils.encoding.force_text() and smart_text()

这个 smart_text()force_text() 别名(自Django 2.0起) smart_str()force_str() 已弃用。如果代码支持将python 2作为 smart_str()force_str() 那里不一样。

其他

  • django.utils.http.urlquote()urlquote_plus()urlunquote()urlunquote_plus() 不赞成使用它们作为函数别名的函数: urllib.parse.quote()quote_plus()unquote()unquote_plus() .

  • django.utils.translation.ugettext()ugettext_lazy()ugettext_noop()ungettext()ungettext_lazy() 不赞成使用它们作为函数别名的函数: django.utils.translation.gettext()gettext_lazy()gettext_noop()ngettext()ngettext_lazy() .

  • 为了限制会话的创建,从而有利于某些缓存策略, django.views.i18n.set_language() 将停止在Django 4.0会话中设置用户语言。自Django 2.1以来,语言始终存储在 LANGUAGE_COOKIE_NAME 饼干。

  • django.utils.text.unescape_entities() 被否决,赞成 html.unescape() . 注意,不像 unescape_entities()html.unescape() 立即计算延迟字符串。

  • 为避免可能混淆有效范围,私人内部公用事业 is_safe_url() 已重命名为 url_has_allowed_host_and_scheme() . 一个URL有一个允许的主机和方案并不意味着它是“安全的”。例如,它仍然可能被错误地引用。确保也使用 iri_to_uri() 在不受信任的URL的路径组件上。

在3.0中删除的功能

这些功能已达到其折旧周期的末尾,并在Django 3.0中删除。

2.0中不推荐的功能 有关这些更改的详细信息,包括如何删除这些功能的用法。

  • 这个 django.db.backends.postgresql_psycopg2 模块被移除。

  • django.shortcuts.render_to_response() 被移除。

  • 这个 DEFAULT_CONTENT_TYPE 设置被删除。

  • HttpRequest.xreadlines() 被移除。

  • 支持 context 的参数 Field.from_db_value()Expression.convert_value() 被移除。

  • 这个 field_name 的关键字参数 QuerySet.earliest()latest() 被移除。

2.1中不推荐的功能 有关这些更改的详细信息,包括如何删除这些功能的用法。

  • 这个 ForceRHR 取消GIS功能。

  • django.utils.http.cookie_date() 被移除。

  • 这个 staticfilesadmin_static 模板标记库将被删除。

  • django.contrib.staticfiles.templatetags.staticfiles.static() 被移除。