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升级到更新版本 如果正在更新现有项目,则提供指南。
Django 3.0支持Python3.6、3.7、3.8和3.9(从3.0.11开始)。我们 强烈推荐 并且仅官方支持每个系列的最新版本。
django 2.2.x系列是最后一个支持python 3.5的系列。
在Django3.0发布之后,我们建议第三方应用程序作者放弃对2.2之前所有版本的Django的支持。那时,您应该能够使用 python -Wd
这样就会出现反预测警告。在修复了拒绝警告之后,您的应用程序应该与Django3.0兼容。
Django现在正式支持 MariaDB 10.1及以上。看到了吗 MariaDB notes 了解更多详细信息。
django3.0通过提供对作为 ASGI 应用。
这是对我们现有的WSGI支持的补充。Django打算在可预见的将来支持这两个项目。不过,异步特性只对在ASGI下运行的应用程序可用。
在这个阶段,异步支持只适用于外部ASGI应用程序。内部一切都保持同步。异步中间件、视图等尚不受支持。但是,您可以在Django的应用程序中使用ASGI中间件,允许您将Django与其他ASGI框架结合起来。
除非您想开始尝试异步代码,否则不需要切换应用程序,但是我们已经做到了 documentation on deploying with ASGI 如果你想了解更多。
注意,作为此更改的副作用,Django现在意识到异步事件循环,并将阻止您从异步上下文调用标记为“异步不安全”的代码(如ORM操作)。如果您以前使用的是异步代码中的Django,如果操作不正确,则可能会触发此问题。如果你看到 SynchronousOnlyOperation
仔细检查同步数据库中的任何错误,然后将其移动到数据库中的任何错误。
新的 ExclusionConstraint
类允许在PostgreSQL上添加排除约束。使用将约束添加到模型中 Meta.constraints
选择权。
输出的表达式 BooleanField
现在可以直接用于 QuerySet
过滤器,而不必首先注释,然后根据注释进行过滤。
自定义枚举类型 TextChoices
, IntegerChoices
和 Choices
现在可以用来定义 Field.choices
. TextChoices
和 IntegerChoices
为文本和整数字段提供类型。这个 Choices
类允许为其他具体数据类型定义兼容的枚举。这些自定义枚举类型支持人类可读的标签,这些标签可以通过枚举或其成员上的属性进行转换和访问。看到了吗 Enumeration types 更多细节和例子。
django.contrib.admin
¶增加了对 admin_order_field
属性 ModelAdmin.list_display
.
新的 ModelAdmin.get_inlines()
方法允许根据请求或模型实例指定内联。
Select2库从版本4.0.3升级到4.0.7。
jQuery从3.3.1版升级到3.4.1版。
django.contrib.auth
¶新的 reset_url_token
属性在 PasswordResetConfirmView
允许指定显示为密码重置URL组件的令牌参数。
补充 BaseBackend
类简化身份验证后端的自定义。
补充 get_user_permissions()
方法镜像现有 get_group_permissions()
方法。
添加了HTML autocomplete
属性设置为中的用户名、电子邮件和密码字段的小部件 django.contrib.auth.forms
以便更好地与浏览器密码管理器交互。
createsuperuser
现在,当在非交互模式下没有提供相应的命令行参数时,返回到password和required字段的环境变量。
REQUIRED_FIELDS
现在支持 ManyToManyField
S
新的 UserManager.with_perm()
方法返回具有指定权限的用户。
PBKDF2密码哈希器的默认迭代计数从150000增加到180000。
django.contrib.gis
¶允许MySQL空间查找函数对实际几何图形进行操作。以前的支持仅限于边界框。
增加了 GeometryDistance
功能,在Postgis上支持。
增加了对 furlong
单位输入 Distance
.
这个 GEOIP_PATH
设置现在支持 pathlib.Path
.
这个 GeoIP2
类现在接受 pathlib.Path
path
.
django.contrib.postgres
¶新的 RangeOperators
有助于避免可以与一起使用的SQL运算符中的键入错误 RangeField
.
新的 RangeBoundary
表达式表示范围边界。
新的 AddIndexConcurrently
和 RemoveIndexConcurrently
类允许创建和删除索引 CONCURRENTLY
在PostgreSQL上。
django.contrib.sessions
¶新的 get_session_cookie_age()
方法允许动态指定会话cookie期限。
add_never_cache_headers()
和 never_cache()
现在添加 private
指示 Cache-Control
标题。
新的 Storage.get_alternative_name()
方法允许自定义生成文件名的算法(如果已存在具有上载名称的文件)。
表单集可以控制在通过 can_order
通过设置 ordering_widget
属性或重写 get_ordering_widget()
.
增加了 LANGUAGE_COOKIE_HTTPONLY
, LANGUAGE_COOKIE_SAMESITE
和 LANGUAGE_COOKIE_SECURE
设置 HttpOnly
, SameSite
和 Secure
语言cookie上的标志。这些设置的默认值保留以前的行为。
增加了对乌兹别克语的支持和翻译。
新的 reporter_class
参数 AdminEmailHandler
允许提供 django.views.debug.ExceptionReporter
子类自定义发送到站点的回溯文本 ADMINS
什么时候? DEBUG
是 False
.
新的 compilemessages --ignore
选项允许在搜索时忽略特定目录 .po
要编译的文件。
showmigrations --list
现在显示应用的日期时间 --verbosity
为2及以上。
在PostgreSQL上, dbshell
现在支持客户端TLS证书。
inspectdb
现在反思 OneToOneField
当外键具有唯一或主键约束时。
新的 --skip-checks
选项在运行命令之前跳过运行系统检查。
这个 startapp --template
和 startproject --template
选项现在支持存储在XZ归档文件中的模板 (.tar.xz
, .txz
)还有LZMA档案馆 (.tar.lzma
, .tlz
)
增加了 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 .
补充 SmallAutoField
就像一个 AutoField
但它只允许在某个(依赖于数据库的)限制下使用值。值来自 1
到 32767
在Django支持的所有数据库中都是安全的。
AutoField
, BigAutoField
和 SmallAutoField
现在继承自 IntegerField
, BigIntegerField
和 SmallIntegerField
分别。系统检查和验证器现在也被正确地继承了。
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 举个例子。
允许 HttpResponse
要用初始化 memoryview
内容。
例如,在Django模板中使用, HttpRequest.headers
现在允许使用下划线进行查找(例如。 user_agent
)代替连字符。
X_FRAME_OPTIONS
现在默认为 'DENY'
. 在旧版本中 X_FRAME_OPTIONS
设置默认为 'SAMEORIGIN'
. 如果站点使用自身的框架,则需要显式地设置 X_FRAME_OPTIONS = 'SAMEORIGIN'
让他们继续工作。
SECURE_CONTENT_TYPE_NOSNIFF
现在默认为 True
. 启用此功能后, SecurityMiddleware
设置 X-Content-Type-Options: nosniff 所有尚未包含的响应的标题。
SecurityMiddleware
现在可以发送 Referrer-Policy 标题。
新测试 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
选项在每次错误或失败时生成调试器。
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")
本节描述第三方数据库后端可能需要的更改。
第二个论点 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
参数,它是插入后返回的字段的iterable。通常这只是自动生成的主键。
django.contrib.admin
¶管理员的模型历史更改消息现在更倾向于可读性更强的字段标签,而不是字段名称。
django.contrib.gis
¶拆下PostGIS 2.1的支架。
拆下了对Spatialite 4.1和4.2的支持。
移除GDAL 1.11和GEOS 3.4的支架。
PostgreSQL 9.4的上游支持将于2019年12月结束。Django3.0支持PostgreSQL 9.5及更高版本。
Oracle 12.1的上游支持将于2021年7月结束。Django 2.2将得到支持,直到2022年4月。Django3.0正式支持Oracle12.2和18c。
虽然在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项目在默认情况下更安全,一些安全设置现在具有更安全的默认值:
X_FRAME_OPTIONS
现在默认为 'DENY'
.
SECURE_CONTENT_TYPE_NOSNIFF
现在默认为 True
.
见 有什么新鲜事 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
作为单数短语,所有其他数值作为复数。这对于某些语言可能不正确。
将值赋给模型的 ForeignKey
或 OneToOneField
'_id'
属性现在取消设置相应的字段。之后访问该字段将导致查询。
patch_vary_headers()
现在处理一个星号 '*'
根据 RFC 7231#section-7.1.4 ,即,如果标题字段名列表包含星号,则 Vary
标题将由一个星号组成 '*'
.
在MySQL8.0.16+上, PositiveIntegerField
和 PositiveSmallIntegerField
现在包含一个check约束来防止数据库中出现负值。
alias=None
添加到的签名中 Expression.get_group_by_cols()
.
RegexPattern
,使用人 re_path()
,不再返回关键字参数 None
要传递给缺少的可选命名组的视图的值。
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的路径组件上。
这些功能已达到其折旧周期的末尾,并在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()
被移除。
这个 staticfiles
和 admin_static
模板标记库将被删除。
django.contrib.staticfiles.templatetags.staticfiles.static()
被移除。
12月 18, 2023