Django4.1 新特点
2022 年 8 月 3 日
欢迎来到 Django 4.1!
这些发行说明涵盖了新功能,以及从 Django 4.0 或更早版本升级时需要注意的一些向后不兼容的更改。我们已经 开始了一些功能的弃用过程。
如果您要更新现有项目,请参阅如何将 Django 升级到更新版本指南。
Python 兼容性¶
Django 4.1 支持 Python 3.8、3.9 和 3.10。我们强烈推荐并且仅官方支持每个系列的最新版本。
视图子类现在可以定义异步 HTTP 方法处理程序:
import asyncio
from django.http import HttpResponse
from django.views import View
class AsyncView(View):
async def get(self, request, *args, **kwargs):
# Perform view logic using await.
await asyncio.sleep(1)
return HttpResponse("Hello async world!")
QuerySet现在为所有数据访问操作提供了一个异步接口。它们按照现有的同步操作命名,但带有a前缀,例如acreate()、aget()等。
新接口允许您编写异步代码,而无需将 ORM 操作包装在sync_to_async():
async for author in Author.objects.filter(name__startswith="A"):
book = await author.books.afirst()
请注意,在这个阶段,底层数据库操作保持同步,并且正在将异步支持下推到 SQL 编译器中,并集成异步数据库驱动程序。新的异步查询集接口目前 sync_to_async()为您封装了必要的操作,并将允许您的代码随着 ORM 的发展利用异步支持的发展。
为了帮助用户使用屏幕阅读器和其他辅助技术, 推荐使用新模板,它将成为从 Django 5.0 输出表单(如在模板中)时的默认表单呈现样式。 为了便于采用新的输出样式,默认表单和表单集模板现在可以通过 FORM_RENDERER设置在项目级别进行配置。 数据库后端¶ Forms¶ 用于在转换为字符串时呈现表单的默认模板,例如在模板中,现在可以通过设置为 提供的类在项目级别进行配置。 Form.template_name现在是延迟到渲染器的属性,但可以用字符串值覆盖以指定每个表单类的模板名称。 类似地,用于渲染表单集的默认模板可以通过匹配的 formset_template_name渲染器属性来指定。 新的 建议使用这种新的输出样式而不是现有的 as_table(),as_p()和as_ul()样式,因为模板实现 基于 div 的输出将成为 Django 5.0 的默认渲染样式。 为了顺利采用新的 例如: 一旦 如果新的 例如,对于 使用的 新的允许通过新的参数 legend_tag()在标签中呈现字段标签。 和 允许阻止新对象创建的新 Media的 新的BoundField.use_fieldset和Widget.use_fieldset 属性有助于识别其输入应分组在 a error_messages参数 现在允许通过传递 和键BaseFormSet为无效数量的表单自定义错误消息。 IntegerField, FloatField, DecimalField现在可以选择接受一个 Internationalization¶ 管理命令¶ Migrations¶ Models¶ 请求和响应¶ Security¶ Signals¶ Templates¶ Tests¶ URLs¶ Utilities¶ Validators¶ 本节介绍第三方数据库后端可能需要的更改。 对 PostgreSQL 10 的上游支持将于 2022 年 11 月结束。Django 4.1 支持 PostgreSQL 11 及更高版本。 MariaDB 10.2 的上游支持将于 2022 年 5 月结束。Django 4.1 支持 MariaDB 10.3 及更高版本。 使用多个搜索词的管理员更改列表搜索现在应用于单个调用 对于多值关系,这意味着来自相关模型的行必须匹配所有项而不是任何项。例如,如果 有关此差异的更多讨论,请参阅生成多值关系主题。在 Django 4.0 及更早版本中, get_search_results()遵循第二个示例查询,但这种未记录的行为导致查询具有过多的连接。 为了将行为与未保存模型实例的多对多关系统一起来,现在 如果您想保留 HTML 链接的用户体验,您可以使用样式设置为显示为链接的表单: 不推荐使用平面 URL 列表的站点地图索引模板的上下文。应针对调整后的 上下文变量更新自定义站点地图索引模板,并期望包含具有 不赞成使用 in的 进行此更改后,makemigrations将生成具有两个操作的新迁移: 未记录的传递 在不提供参数的情况 不推荐将未保存的模型实例传递给相关过滤器。在 Django 5.0 中,将引发异常。 django.utils.timezone.utc别名 to已datetime.timezone.utc 弃用。直接使用datetime.timezone.utc。 不推荐将响应对象和表单/表单集名称传递给 或直接传递表单/表单集对象。 未记录 传递 作为基于表的模板的代理的 这些功能已经到了弃用周期的末尾,并在 Django 4.1 中被删除。 有关这些更改的详细信息,包括如何删除这些功能的使用,请参阅3.2 中弃用的功能。
{{ form }}次要功能¶
FieldListFilter 现在可以在使用查找过滤多个值时控制查询字符串值分隔符__in。clone参数GEOSGeometry.normalize()允许创建几何的标准化克隆。int的按位。XORdefault_bounds属性允许为列表和元组输入指定边界。DateTimeRangeFieldDecimalRangeField现在 通过新 get_latest_lastmod()方法包括可用的时间戳。应针对调整后的上下文变量更新自定义站点地图索引模板。DatabaseFeatures.minimum_database_version 元组属性(例如,表示“10.0”)指定数据库的最低要求版本。如果指定了最低版本,后端还必须实现 ,它返回当前数据库版本的元组。必须调用后端的 方法才能运行检查。(10, 0)DatabaseWrapper.get_database_version()DatabaseWrapper.init_connection_state()super(){{ form }}form_template_nameFORM_RENDERERdiv.html表单模板、引用 Form.template_name_div属性和匹配Form.as_div() 方法使用 HTML和对相关输入进行分组,并且屏幕阅读器用户更容易导航。FORM_RENDERER = "django.forms.renderers.DjangoDivFormRenderer"
FORM_RENDERER那时可以删除该 声明。 输出样式as_p(),您可以将表单渲染器设置定义form_template_name为 "django/forms/p.html"和formset_template_nameto "django/forms/formsets/p.html"。taglabel_tag()edit_only参数。modelformset_factory()inlineformset_factory()js和cssclass 属性 现在允许使用可散列对象,而不仅仅是路径字符串,只要这些对象实现该方法(通常在使用装饰器装饰时)。__html__()html_safe()和 a中的小部件。'too_few_forms''too_many_forms'step_size 参数。这用于设置stepHTML 属性,并在表单提交时进行验证。stderrstdoutdjango_migrationsblack命令进行格式化,如果它存在于您的PATH.RemoveIndex重AddIndex命名 Meta.indexes.AlterIndexTogether的AddIndex索引 移动 Meta.index_together到 Meta.indexes.order_by参数 Window现在接受对字段和转换的字符串引用。chunk_size提供参数就支持预取相关对象。在旧版本中,没有进行预取。^互斥或 ( XOR) 运算符进行组合。XORMariaDB 和 MySQL 原生支持。对于不支持的数据库,将使用、和XOR将查询转换为等效的。ANDORNOTAutoField和BigAutoField现在SmallAutoField被创建为标识列,而不是带有序列的串行列。max_age。origin删除。元素属性。idjson_scriptTrueOPTIONS['loaders']OPTIONS['loaders']spawn.RuntimeError,与测试外部相同。SimpleLazyObject现在支持加法运算。step_size添加到表示数值的表单字段中的新参数。4.1 中向后不兼容的更改¶
数据库后端 API ¶
BaseDatabaseFeatures.has_case_insensitive_like从 更改True 为False以反映大多数数据库的行为。DatabaseIntrospection.get_key_columns()已移除。改为使用 DatabaseIntrospection.get_relations()。DatabaseOperations.ignore_conflicts_suffix_sql()方法被替换为 DatabaseOperations.on_conflict_suffix_sql()接受fields, on_conflict,update_fields和unique_fields参数的方法。ignore_conflicts参数 DatabaseOperations.insert_statement()被替换为 on_conflict接受django.db.models.constants.OnConflict。DatabaseOperations._convert_field_to_tz()替换为 DatabaseOperations._convert_sql_to_tz()接受sql, params和tzname参数。DatabaseOperations参数而不是返回包含一些 SQL 和要插入到该 SQL 中的参数的 2 元组。更改后的方法具有以下新签名:sqlparamsfield_name
DatabaseOperations.date_extract_sql(lookup_type, sql, params)DatabaseOperations.datetime_extract_sql(lookup_type, sql, params, tzname)DatabaseOperations.time_extract_sql(lookup_type, sql, params)DatabaseOperations.date_trunc_sql(lookup_type, sql, params, tzname=None)DatabaseOperations.datetime_trunc_sql(self, lookup_type, sql, params, tzname)DatabaseOperations.time_trunc_sql(lookup_type, sql, params, tzname=None)DatabaseOperations.datetime_cast_date_sql(sql, params, tzname)DatabaseOperations.datetime_cast_time_sql(sql, params, tzname)django.contrib.gis¶
放弃对 PostgreSQL 10 的支持¶
不再支持 MariaDB 10.2 ¶
管理员更改列表搜索跨越多值关系更改¶
filter(),而不是顺序filter()调用。search_fields 设置为,并且用户搜索 ,则仅当与某个名为 Jamal 的 17 岁孩子有关系时才会返回父行,而不是返回只有一个名为 Jamal 的孩子的父母贾马尔除了有些17岁。['child__name', 'child__age']'Jamal 17'未保存模型实例的反向外键更改¶
ValueError在调用 未保存对象时会引发反向外键。related managersMiscellaneous¶
request.META['CSRF_COOKIE']用于存储未屏蔽的 CSRF 机密而不是屏蔽版本。这是一个未记录的私有 API。type="text/css"属性不再包含在CSS表单媒体的标签中。formset:addedJavaScript 事件现在是纯 JavaScript 事件,formset:removed不依赖于 jQuery。有关更改的更多详细信息,请参阅 内联表单事件。exc_info未记录 函数的参数django.utils.log.log_response()被替换为exception.size未记录 函数的参数django.views.static.was_modified_since()被删除。POST请求。InlineAdminFormSet.non_form_errors属性被non_form_errors()方法替换。这与BaseFormSet.OPTIONS['loaders']如有必要,您可以指定覆盖它。django.contrib.auth.views.SuccessURLAllowedHostsMixin mixin 被替换为RedirectURLMixin.URLResolver._is_callback()的 , URLResolver._callback_strs和URLPattern.lookup_str()被移动到django.contrib.admindocs.utils.exclude值转换为一个 set. 最好将exclude值作为 a传递set给Model.clean_fields()、Model.full_clean()、 Model.validate_unique()和Model.validate_constraints() 方法。asgiref从 3.4.1 增加到 3.5.2。4.1 中弃用的功能¶
通过 GET 注销¶
GET不推荐通过对 的请求注销。请改用请求。built-in logout viewPOST<form id="logout-form" method="post" action="{% url 'admin:logout' %}">
{% csrf_token %}
<button type="submit">{% translate "Log out" %}button>
form>
#logout-form {
display: inline;
}
#logout-form button {
background: none;
border: none;
cursor: pointer;
padding: 0;
text-decoration: underline;
}
Miscellaneous¶
location可选lastmod属性的对象列表。CSRF_COOKIE_MASKED过渡设置已弃用。name参数 of已被弃用,django.utils.functional.cached_property()因为它在 Python 3.6 中是不必要的。opclasses论点, django.contrib.postgres.constraints.ExclusionConstraint而赞成使用OpClass() in ExclusionConstraint.expressions。要使用它,您需要 'django.contrib.postgres'在您的INSTALLED_APPS.RemoveConstraint和AddConstraint. 由于此更改对数据库架构没有影响,因此该SeparateDatabaseAndState 操作可用于仅更新迁移状态而不运行任何 SQL。将生成的操作移到 的state_operations参数中 SeparateDatabaseAndState。例如:class Migration(migrations.Migration):
...
operations = [
migrations.SeparateDatabaseAndState(
database_operations=[],
state_operations=[
migrations.RemoveConstraint(
...
),
migrations.AddConstraint(
...
),
],
),
]
errors=None给 SimpleTestCase.assertFormError()和 的能力assertFormsetError()已被弃用。改为使用errors=[] 。django.contrib.sessions.serializers.PickleSerializer由于存在远程代码执行的风险,已弃用。QuerySet.iterator()下预取相关对象的查询集上的chunk_size使用已被弃用。在旧版本中,没有进行预取。提供值chunk_size 表示需要预取的每个块的附加查询。created=True被添加到 的签名中 RemoteUserBackend.configure_user()。不推荐支持RemoteUserBackend 不接受此参数的子类。SimpleTestCase.assertFormError()and assertFormsetError()。利用:assertFormError(response.context['form_name'], …)
assertFormsetError(response.context['formset_name'], …)
django.contrib.gis.admin.OpenLayersWidget的已弃用。django.contrib.auth.hashers.CryptPasswordHasher已弃用。nulls_first=False或nulls_last=False传递 Expression.asc()和Expression.desc()方法的能力,并且OrderBy 表达式已被弃用。改为使用None。"django/forms/default.html"和 "django/forms/formsets/default.html"模板已被弃用。请改用特定模板。4.1 中删除的功能¶
copy.deepcopy()to 类属性创建深层副本的对象的支持。TestCase.setUpTestData()whitelist参数和domain_whitelist属性 django.core.validators.EmailValidator被删除。default_app_config应用程序配置变量被删除。TransactionTestCase.assertQuerysetEqual()repr()与字符串值相比时不再调用查询集。django.core.cache.backends.memcached.MemcachedCache后端被移除。django.contrib.messages.storage.cookie.CookieStorage删除了对 Django 3.2 之前使用的消息格式的支持 。
最长公共子串问题
从2022安洵杯[babyPHP]看Soap+CLRF造成SSRF漏洞
数据结构全解(链,数组,栈,树,图)与算法分析(排序,查找,递归,分治,动态规划)
java获取jenkins发布版本信息
CoreDNS篇8-健康检查
手动dump失败问题
嵌入式(Linux内核的安装与加载)
矩阵求导数
代碼隨想錄算法訓練營|第五十二天|123 买卖股票的最佳时机III、188 买卖股票的最佳时机IV。刷题心得(c++)