Django 1.1 发行说明 — Django 文档

来自菜鸟教程
Django/docs/3.1.x/releases/1.1
跳转至:导航、​搜索

Django 1.1 发行说明

2009 年 7 月 29 日

欢迎使用 Django 1.1!

Django 1.1 包括许多漂亮的 新功能 、大量错误修复以及从 Django 1.0 开始的简单升级路径。

1.1 中向后不兼容的更改

Django 有 API 稳定性 的政策。 这意味着,一般来说,您针对 Django 1.0 开发的代码应该继续针对 1.1 工作,不变。 但是,如果需要解决错误,我们有时会进行向后不兼容的更改,并且在 Django 1.0 和 Django 1.1 之间有一些此类(次要)更改。

在升级到 Django 1.1 之前,您应该仔细检查以下更改是否不会影响您,如果有影响,请升级您的代码。

对约束名称的更改

Django 1.1 修改了用于生成数据库约束名称的方法,以便无论机器字大小如何,名称都是一致的。 对于某些用户,此更改向后不兼容。

如果您使用的是 32 位平台,那么您就不用担心了; 由于此更改,您不会发现任何差异。

但是,64位平台用户使用reset管理命令可能会遇到一些问题。 在此更改之前,64 位平台将在约束名称中生成 64 位、16 个字符的摘要; 例如:

ALTER TABLE myapp_sometable ADD CONSTRAINT object_id_refs_id_5e8f10c132091d1e FOREIGN KEY ...

在此更改之后,所有平台,无论字长如何,都将在约束名称中生成 32 位、8 个字符的摘要; 例如:

ALTER TABLE myapp_sometable ADD CONSTRAINT object_id_refs_id_32091d1e FOREIGN KEY ...

由于此更改,您将无法在 64 位机器创建的任何表上使用 reset 管理命令。 这是因为新生成的名称将与历史生成的名称不匹配; 因此,reset 命令构造的 SQL 将无效。

如果您需要重置使用 64 位约束创建的应用程序,则需要在调用 reset 之前手动删除旧约束。


测试用例现在在事务中运行

Django 1.1 在事务内运行测试,从而获得更好的测试性能(详见 测试性能改进 )。

如果现有测试需要测试事务行为,如果它们依赖于关于测试环境的无效假设,或者如果它们需要特定的测试用例排序,则此更改略微向后不兼容。

对于这些情况,可以改用 TransactionTestCase。 这只是绕过新回滚方法揭示的测试用例错误的快速修复; 在长期测试中应该重写以更正测试用例。


移除 SetRemoteAddrFromForwardedFor 中间件

为方便起见,Django 1.0 包含了一个可选的中间件类——django.middleware.http.SetRemoteAddrFromForwardedFor——它根据一些代理配置通常设置的 HTTP X-Forwarded-For 标头更新了 REMOTE_ADDR 的值。

已经证明,这种机制对于通用用途来说不够可靠,并且(尽管有相反的文档)它包含在 Django 中可能会导致应用程序开发人员假设 REMOTE_ADDR 的值是“安全的”或以某种方式可靠地作为身份验证的来源。

虽然不是直接的安全问题,但我们决定在 Django 1.1 版本中删除这个中间件。 它已被一个除了引发 DeprecationWarning 之外什么都不做的类所取代。

如果你一直依赖这个中间件,最简单的升级路径是:

  • 检查 删除之前存在的代码
  • 验证它是否与您的上游代理一起正常工作,修改它以支持您的特定代理(如有必要)。
  • 将您修改后的 SetRemoteAddrFromForwardedFor 版本作为您自己项目中的一个中间件引入。


上传文件的名称稍后可用

在 Django 1.0 中,上传并存储在模型 FileField 中的文件在模型保存到数据库之前先保存到磁盘。 这意味着分配给文件的实际文件名在保存之前可用。 例如,它在模型的预保存信号处理程序中可用。

在 Django 1.1 中,文件被保存为在数据库中保存模型的一部分,因此在 之后 模型已保存之前,不能依赖磁盘上使用的实际文件名。


更改模型表单集的保存方式

在 Django 1.1 中,BaseModelFormSet 现在调用 ModelForm.save()

如果您在模型表单集的 __init__ 中修改 self.initial,或者您依赖于 BaseFormSet 的内部 _total_form_count_initial_form_count 属性,则这是向后不兼容的。 这些属性现在是公共方法。


修复了 join 过滤器的转义行为

:tfilter:`join` 过滤器不再转义为连接器传入的文字值。

这对于包含五个特殊 HTML 字符之一的文字字符串的特殊情况是向后不兼容的。 因此,如果你在写 模板:Foo,你现在必须写 模板:Foo

以前的行为是一个错误,与记录和预期的情况相反。


永久重定向和 redirect_to() 通用视图

Django 1.1 向 django.views.generic.simple.redirect_to() 视图添加了 permanent 参数。 如果您使用带有称为“永久”的格式字符串键的 redirect_to 视图,这在技术上是向后不兼容的,这是极不可能的。


1.1 中弃用的功能

一项功能在 Django 1.1 中被标记为已弃用:

  • 您不应再使用 AdminSite.root() 来注册该管理员视图。 也就是说,如果您的 URLconf 包含以下行:

    (r'^admin/(.*)', admin.site.root),

    您应该将其更改为:

    (r'^admin/', include(admin.site.urls)),

您应该立即开始从您的代码中删除此功能的使用。

如果在 Django 1.1 中使用,AdminSite.root 将引发 PendingDeprecationWarning。 默认情况下,此警告是隐藏的。 在 Django 1.2 中,此警告将升级为 DeprecationWarning,并会大声显示。 Django 1.3 将完全删除 AdminSite.root()

有关我们的弃用政策和策略的更多详细信息,请参阅 Django 的发布过程


Django 1.1 中的新功能

相当多:自 Django 1.0 以来,我们已经提交了 1,290 次代码,修复了 1,206 个错误,并添加了大约 10,000 行文档。

Django 1.1 的主要新特性是:

ORM 改进

Django 的对象关系映射器 (ORM) 中添加了两个主要增强功能:聚合支持和查询表达式。

综合支持

现在可以运行 SQL 聚合查询(即 COUNT()MAX()MIN() 等)来自 Django 的 ORM。 您可以选择直接返回聚合的结果,或者使用聚合查询的结果注释 QuerySet 中的对象。

此功能可用作新的 aggregate()annotate() 方法,并在 ORM 聚合文档 中详细介绍。


查询表达式

查询现在可以引用查询上的另一个字段,并且可以遍历关系以引用相关模型上的字段。 这是在新的 F 对象中实现的; 有关完整的详细信息,包括示例,请参阅 F 表达式文档


模型改进

Django 的模型层添加了许多功能:

“非托管”模型

您现在可以使用 managed 模型选项控制 Django 是否管理模型的数据库表的生命周期。 默认为 True,这意味着 Django 将在 syncdb 中创建适当的数据库表,并将它们作为 reset 命令的一部分删除。 也就是说,Django 管理 数据库表的生命周期。

但是,如果将其设置为 False,则不会为此模型自动执行数据库表的创建或删除。 如果模型表示现有表或通过其他方式创建的数据库视图,这将非常有用。

有关更多详细信息,请参阅 managed 选项的文档。


代理模型

您现在可以创建 代理模型 :现有模型的子类,仅添加 Python 级别(而不是数据库级别)行为并且不由新表表示。 也就是说,新模型是某个底层模型的 代理 ,它存储了所有真实数据。

所有细节都可以在 代理模型文档 中找到。 此功能在表面上与非托管模型相似,因此文档解释了 代理模型与非托管模型的区别


延期字段

在某些复杂情况下,您的模型可能包含可能包含大量数据的字段(例如,大型文本字段),或者需要进行昂贵的处理才能将它们转换为 Python 对象。 如果您知道不需要这些特定字段,现在可以告诉 Django 不要从数据库中检索它们。

您将使用新的查询集方法 defer()only() 执行此操作。


测试改进

测试框架 进行了一些显着改进。

测试性能改进

使用 Django 的 测试框架 编写的测试现在运行速度显着加快(在许多情况下快 10 倍)。

这是通过引入基于事务的测试来实现的:当使用 django.test.TestCase 时,您的测试现在将在完成后回滚的事务中运行,而不是通过刷新和重新填充数据库。 这为大多数类型的单元测试带来了巨大的加速。 请参阅 TestCaseTransactionTestCase 的文档以获取完整说明以及有关数据库支持的一些重要说明。


测试客户端改进

对测试客户端进行了一些小但非常有用的改进:

  • 测试 Client 现在可以使用 follow 参数自动跟踪重定向到 Client.get()Client.post()。 这使得发出重定向的测试视图变得更简单。
  • 现在可以更轻松地获取测试客户端返回的响应中的模板上下文:您只需将上下文作为 request.context[key] 访问。 将 request.context 视为上下文列表的旧方法,继承链中的每个渲染模板一个,如果您需要它仍然可用。


新的管理功能

Django 1.1 向 Django 的管理界面添加了几个漂亮的新功能:

更改列表中的可编辑字段

您现在可以通过新的 list_editable 管理选项在管理列表视图中编辑字段。 这些字段将在列表页面上显示为表单小部件,并且可以批量编辑和保存。


管理员“操作”

您现在可以定义 管理操作 ,该操作可以批量对一组模型执行某些操作。 用户将能够在更改列表页面上选择对象,然后将这些批量操作应用于所有选定的对象。

Django 附带一个预定义的管理操作,可以一举删除一组对象。


条件视图处理

Django 现在使用标准 ETagLast-Modified HTTP 标头更好地支持 [X39X] 条件视图处理 。 这意味着您现在可以通过测试成本较低的条件轻松地短路视图处理。 对于许多视图,这会导致速度的显着提高和带宽的减少。


网址命名空间

Django 1.1 通过引入 URL“命名空间”改进了 命名 URL 模式

简而言之,此功能允许来自同一应用程序的同一组 URL 多次包含在 Django URLConf 中,并在执行反向解析时使用不同的(并且可能嵌套的)命名前缀。 换句话说,像 Django 的管理界面这样的可重用应用程序可以被多次注册而不会发生 URL 冲突。

有关完整的详细信息,请参阅 定义 URL 命名空间 的文档。


吉奥姜戈

在 Django 1.1 中,GeoDjango(即 django.contrib.gis) 有几个新功能:

  • 支持 SpatiaLite – SQLite 的空间数据库 – 作为空间后端。
  • 地理聚合(CollectExtentMakeLineUnion)和 F 表达式。
  • 新的 GeoQuerySet 方法:collectgeojsonsnap_to_grid
  • GEOSGeometry 对象的新列表接口方法。

有关更多详细信息,请参阅 GeoDjango 文档。


其他改进

自 Django 1.0 以来引入的其他新功能和更改包括:

  • CSRF 保护中间件 已分为两类 - CsrfViewMiddleware 检查传入请求,CsrfResponseMiddleware 处理传出响应。 组合的 CsrfMiddleware 类(两者都做)仍然是为了向后兼容,但现在建议使用拆分类,以便对 CSRF 处理发生的时间和地点进行细粒度控制。
  • reverse() 和使用它的代码(例如,{% url %} 模板标签)现在可以处理 Django 管理站点中的 URL,前提是管理 URL 是通过 include(admin.site.urls)(发送admin 对 admin.site.root 视图的请求仍然有效,但以这种方式配置时,admin 中的 URL 将不会“可逆”)。
  • 除了模块名称之外,Django URLconf 模块中的 include() 函数现在可以接受 URL 模式序列(由 patterns() 生成)。
  • Django 表单的实例(参见 表单概览 )现在有两个额外的方法,hidden_fields()visible_fields(),它们返回隐藏的列表——即 <input type="hidden"> ] – 和表单上的可见字段。
  • redirect_to 通用视图现在接受一个额外的关键字参数 permanent。 如果 permanentTrue,则视图将发出 HTTP 永久重定向(状态代码 301)。 如果 False,视图将发出 HTTP 临时重定向(状态代码 302)。
  • DateFieldDateTimeField 添加了新的数据库查找类型 - week_day。 这种类型的查找接受 1(星期日)和 7(星期六)之间的数字,并返回字段值与一周中的那一天匹配的对象。 有关详细信息,请参阅 查找类型的完整列表
  • Django 模板语言中的 {% for %} 标签现在接受一个可选的 {% empty %} 子句,当要求 {% for %} 循环一个空序列时显示。 有关此示例,请参阅 内置模板标签列表
  • :djadmin:`dumpdata` 管理命令现在接受单个模型名称作为参数,允许您仅从特定模型导出数据。
  • 有一个新的 :tfilter:`safeseq` 模板过滤器,它的工作原理类似于列表的 :tfilter:`safe`,将列表中的每个项目标记为安全。
  • 缓存后端现在支持incr()decr()命令来增加和减少缓存键的值。 在支持原子递增/递减的缓存后端——最值得注意的是,memcached 后端——这些操作将是原子的,而且非常快。
  • Django 现在可以 通过支持用于此目的的标准 REMOTE_USER 环境变量的新身份验证后端轻松地将身份验证委托给 Web 服务器
  • 有一个新的 django.shortcuts.redirect() 函数,可以更轻松地根据对象、视图名称或 URL 发出重定向。
  • postgresql_psycopg2 后端现在支持 [X35X] 原生 PostgreSQL 自动提交 。 这是一个高级的、特定于 PostgreSQL 的功能,它可以使某些读取密集型应用程序的速度大大提高。


下一步是什么?

我们将休息片刻,然后将开始 Django 1.2 的工作——疲倦的人不要休息! 如果您愿意提供帮助,每天都会在 django-developers 邮件列表和 irc.libera.chat。 欢迎加入讨论!

Django 的在线文档还包括有关如何为 Django 做出贡献的提示:

任何级别的贡献——开发代码、编写文档或简单地分类票证和帮助测试提议的错误修正——总是受到欢迎和赞赏。

事情就是这样。