Django 2.2 发行说明 — Django 文档
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 中的新功能
小功能
django.contrib.gis
- 添加了 Oracle 对 Envelope 函数的支持。
- 为 :lookup:`coveredby` 和 :lookup:`covers` 查找添加了 SpatiaLite 支持。
django.contrib.postgres
- ArrayAgg 和 StringAgg 的新
ordering
参数决定了聚合元素的顺序。 - 新的 BTreeIndex、HashIndex 和 SpGistIndex 类允许创建
B-Tree
、hash
和SP-GiST
索引在数据库中。 - BrinIndex 现在有
autosummarize
参数。 - SearchQuery 的新
search_type
参数允许搜索短语或原始表达式。
django.contrib.staticfiles
- 为
collectstatic --ignore
选项添加了路径匹配,以便可以使用像/vendor/*.js
这样的模式。
国际化
- 添加了对亚美尼亚语的支持和翻译。
管理命令
- 新的
--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 来提高观看大量文件更改的性能。
型号
- 添加了对 PostgreSQL 运算符类的支持 (Index.opclasses)。
- 添加了对部分索引的支持 (Index.condition)。
- 添加了 NullIf 和 Reverse 数据库函数,以及许多 数学数据库函数 。
- 将 QuerySet.bulk_create() 的新
ignore_conflicts
参数设置为True
告诉数据库忽略插入未通过唯一性约束或其他检查的行的失败。 - 新的 ExtractIsoYear 函数从 DateField 和 DateTimeField 中提取 ISO-8601 周编号年份,以及新的 :lookup:`iso_year`查找允许按 ISO-8601 周编号年份查询。
- 新的 QuerySet.bulk_update() 方法允许有效地更新多个模型实例上的特定字段。
- Django 不再总是在执行单个查询时启动事务,例如
Model.save()
、QuerySet.update()
和Model.delete()
。 这通过减少数据库往返次数来提高自动提交的性能。 - 添加了对 StdDev 和 Variance 函数的 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 的内部结构,否则此更改不应影响您的测试。
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.ConcreteModel
的 app.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 上,
PositiveIntegerField
和PositiveSmallIntegerField
现在包含检查约束以防止数据库中出现负值。 如果您有现有的无效数据并运行重新创建表的迁移,您将看到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
现在呈现unknown
、true
和false
的<option>
值而不是 [ X140X]、2
和3
。 为了向后兼容,旧值仍被接受为数据。Group.name
max_length
is increased from 80 to 150 characters.违反可延迟数据库约束的测试现在在 SQLite 3.20+ 上运行时会出错,就像在支持此类约束的其他后端上一样。
为了捕捉使用错误,如果
None
作为值传递,测试 Client 和 django.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 取代)。当输入为 Avg、StdDev 和 Variance 聚合函数现在返回
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_queries、TransactionTestCase.multi_db 和 TestCase.multi_db 属性,取而代之的是 SimpleTestCase.881X5X]、 TransactionTestCase.databases 和 TestCase.databases。 这些新属性允许声明数据库依赖项,以防止针对非默认数据库的意外查询在测试之间泄漏状态。 之前的
allow_database_queries=True
和multi_db=True
的行为可以通过设置databases='__all__'
来实现。