Django 3.0发布说明

December 2, 2019

欢迎来到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支持Python 3.6、3.7、3.8和3.9(截至3.0.11)。我们 highly recommend 并且仅官方支持每个系列的最新版本。

Django 2.2.x系列是最后一个支持Python 3.5的系列。

第三方库支持旧版本的Django

Django 3.0发布后,我们建议第三方应用程序作者放弃对Django 2.2之前所有版本的支持。那时,您应该能够使用运行包的测试 python -Wd 以便出现弃用警告。修复弃用警告后,您的应用程序应该与Django 3.0兼容。

Django 3.0中有什么新功能

MariaDB支持

Django现在正式支持 MariaDB 10.1甚至更高。看到 MariaDB notes 了解更多详细信息。

ASGI支持

Django 3.0通过提供跑步支持,开启了我们让Django完全具备网络控制能力的旅程 ASGI 应用程序.

这是我们现有的WSGI支持的补充。Django打算在可预见的未来支持两者。但是,Asmat功能仅适用于在ASGI下运行的应用程序。

在此阶段,Expressc支持仅适用于外部ASGI应用程序。内部一切保持同步。目前尚不支持同步中间件、视图等。然而,您可以在Django的应用程序周围使用ASGI中间件,允许您将Django与其他ASGI框架结合起来。

除非您想开始尝试同步代码,否则无需切换应用程序,但我们已经 documentation on deploying with ASGI 如果您想了解更多信息。

请注意,作为此更改的副作用,Django现在意识到了同步事件循环,并将阻止您从同步上下文中调用标记为“Deliverc不安全”的代码(例如ORM操作)。如果您以前使用过Deliverc代码中的Django,如果您操作错误,可能会触发此操作。如果你看到一个 SynchronousOnlyOperation 错误,然后仔细检查您的代码并将任何数据库操作移至同步子线程中。

PostgreSQL的排除约束

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

过滤表达式

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

模型字段选择的列举

自定义列举类型 TextChoices , IntegerChoices ,以及 Choices 现在可以作为定义的一种方式 Field.choices 。 TextChoices 和 IntegerChoices 为文本和integer字段提供了类型。的 Choices 类允许为其他具体数据类型定义兼容的列举。这些自定义列举类型支持人类可读的标签,这些标签可以通过列举或其成员上的属性进行翻译和访问。看到 Enumeration types 了解更多细节和示例。

次要特征

django.contrib.admin

  • 添加了对 admin_order_field 属性上的属性 ModelAdmin.list_display 。

  • 新的 ModelAdmin.get_inlines() 方法允许根据请求或模型实例指定内联。

  • select 2库从4.0.3版本升级到4.0.7。

  • jQuery从3.3.1版本升级到3.4.1。

django.contrib.auth

django.contrib.gis

django.contrib.postgres

django.contrib.sessions

django.contrib.syndication

隐藏物

文件存储

形式

国际化

登录

  • 新的 reporter_class 的参数 AdminEmailHandler 允许提供一个 django.views.debug.ExceptionReporter 用于自定义发送到站点的追溯文本的子类 ADMINS 什么时候 DEBUG 是 False 。

管理命令

模型

  • 添加哈希数据库功能 MD5 , SHA1 , SHA224 , SHA256 , SHA384 ,以及 SHA512 。

  • 添加了 Sign 数据库功能。

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

  • connection.queries 现在显示 COPY … TO PostgreSQL上的声明。

  • FilePathField 现在接受可调用 path 。

  • 允许对称中间表用于自我引用 ManyToManyField 。

  • 这个 name 的属性 CheckConstraint , UniqueConstraint ,以及 Index 现在使用 '%(app_label)s' 和 '%(class)s' 占位符。

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

  • Avg 和 Sum 现在支持 distinct 争论。

  • 增列 SmallAutoField 它的作用很像 AutoField 除了它只允许在一定(取决于数据库)限制下的值。值从 1 至 32767 在Django支持的所有数据库中都安全。

  • AutoField , BigAutoField ,以及 SmallAutoField 现在继承自 IntegerField , BigIntegerField 和 SmallIntegerField 分别系统检查和验证器现在也被正确继承。

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

  • CheckConstraint 现在在SQL 8.0.16+上支持。

  • 新的 allows_group_by_selected_pks_on_model() 方法论 django.db.backends.base.BaseDatabaseFeatures 允许优化 GROUP BY 条款仅需要所选模型的主密钥。默认情况下,它仅支持PostgreSQL上的托管模型。

    要启用 GROUP BY 对于非托管模型的纯主关键字优化,您必须对PostgreSQL数据库引擎进行子类,重写要素类 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() ,现在将引用同一字符的文本、字符引用和实体引用视为等效内容。

  • DiscoverRunner 现在可以在每次出错或失败时使用 test --pdb 选择。

3.0中向后不兼容的更改

Model.save() 当为主密钥提供默认值时

Model.save() 保存新行时不再尝试查找行 Model 实例并提供了主密钥的默认值,并且始终执行单个 INSERT 查询.在旧的Django版本中, Model.save() 要么表现得 INSERT 或者是一个 UPDATE 根据该行是否存在。

这使得呼叫 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_insert 和 can_return_ids_from_bulk_insert 已更名为 can_return_columns_from_insert 和 can_return_rows_from_bulk_insert 。

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

  • 条目 AutoField , BigAutoField ,以及 SmallAutoField 添加到 DatabaseOperations.integer_field_ranges 以支持这些字段类型的整范围验证器。第三方后台可能需要自定义默认条目。

  • DatabaseOperations.fetch_returned_insert_id() 被替换为 fetch_returned_insert_columns() 它返回由 INSERT … RETURNING 声明,而不是单个值。

  • DatabaseOperations.return_insert_id() 被替换为 return_insert_columns() 接受一个 fields 参数,这是插入后返回的字段的可迭代对象。通常这只是自动生成的公钥。

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月结束。Django 3.0支持PostgreSQL 9.5及更高版本。

放弃对Oracle 12.1的支持

对Oracle 12.1的上游支持将于2021年7月结束。Django 2.2将支持至2022年4月。Django 3.0正式支持Oracle 12.2和18 c。

删除了私有Python 2兼容性API

虽然Django 2.0中删除了Python 2支持,但Django中并未删除一些私有API,以便第三方应用程序可以继续使用它们,直到Python 2报废。

由于我们预计应用程序在添加对Django 3.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() - 别名 functools.lru_cache() 。

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

  • django.utils.decorators.ContextDecorator - 别名 contextlib.ContextDecorator 。

  • django.utils._os.abspathu() - 别名 os.path.abspath() 。

  • django.utils._os.upath() 和 npath() - 这些函数在Python 3上不起任何作用。

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

  • django.utils.encoding.python_2_unicode_compatible() - 别名 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项目在默认情况下更加安全,一些安全设置现在具有更安全的默认值:

请参阅 What's New 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() 现在按原样编码可迭代值 doseq=False ,而不是迭代它们,使其与标准库保持一致 urllib.parse.urlencode() 功能。

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

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

  • patch_vary_headers() 现在处理星号 '*' 根据 RFC 7231 Section 7.1.4 ,即如果标题字段名称列表包含星号,则 Vary 页眉将由单个星号组成 '*' 。

  • 在SQL 8.0.16+上, PositiveIntegerField 和 PositiveSmallIntegerField 现在包括检查约束以防止数据库中出现负值。

  • 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 地理信息系统功能已删除。

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

  • 这个 staticfiles 和 admin_static 模板标签库将被删除。

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