Django 1.1 发行说明 — Django 文档
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 聚合文档 中详细介绍。
模型改进
Django 的模型层添加了许多功能:
“非托管”模型
您现在可以使用 managed 模型选项控制 Django 是否管理模型的数据库表的生命周期。 默认为 True
,这意味着 Django 将在 syncdb
中创建适当的数据库表,并将它们作为 reset
命令的一部分删除。 也就是说,Django 管理 数据库表的生命周期。
但是,如果将其设置为 False
,则不会为此模型自动执行数据库表的创建或删除。 如果模型表示现有表或通过其他方式创建的数据库视图,这将非常有用。
有关更多详细信息,请参阅 managed 选项的文档。
代理模型
您现在可以创建 代理模型 :现有模型的子类,仅添加 Python 级别(而不是数据库级别)行为并且不由新表表示。 也就是说,新模型是某个底层模型的 代理 ,它存储了所有真实数据。
所有细节都可以在 代理模型文档 中找到。 此功能在表面上与非托管模型相似,因此文档解释了 代理模型与非托管模型的区别 。
测试改进
对 测试框架 进行了一些显着改进。
测试性能改进
使用 Django 的 测试框架 编写的测试现在运行速度显着加快(在许多情况下快 10 倍)。
这是通过引入基于事务的测试来实现的:当使用 django.test.TestCase 时,您的测试现在将在完成后回滚的事务中运行,而不是通过刷新和重新填充数据库。 这为大多数类型的单元测试带来了巨大的加速。 请参阅 TestCase 和 TransactionTestCase 的文档以获取完整说明以及有关数据库支持的一些重要说明。
测试客户端改进
对测试客户端进行了一些小但非常有用的改进:
- 测试 Client 现在可以使用
follow
参数自动跟踪重定向到 Client.get() 和 Client.post()。 这使得发出重定向的测试视图变得更简单。 - 现在可以更轻松地获取测试客户端返回的响应中的模板上下文:您只需将上下文作为
request.context[key]
访问。 将request.context
视为上下文列表的旧方法,继承链中的每个渲染模板一个,如果您需要它仍然可用。
新的管理功能
Django 1.1 向 Django 的管理界面添加了几个漂亮的新功能:
管理员“操作”
您现在可以定义 管理操作 ,该操作可以批量对一组模型执行某些操作。 用户将能够在更改列表页面上选择对象,然后将这些批量操作应用于所有选定的对象。
Django 附带一个预定义的管理操作,可以一举删除一组对象。
条件视图处理
Django 现在使用标准 ETag
和 Last-Modified
HTTP 标头更好地支持 [X39X] 条件视图处理 。 这意味着您现在可以通过测试成本较低的条件轻松地短路视图处理。 对于许多视图,这会导致速度的显着提高和带宽的减少。
URL 命名空间
Django 1.1 通过引入 URL“命名空间”改进了 命名 URL 模式 。
简而言之,此功能允许来自同一应用程序的同一组 URL 多次包含在 Django URLConf 中,并在执行反向解析时使用不同的(并且可能嵌套的)命名前缀。 换句话说,像 Django 的管理界面这样的可重用应用程序可以被多次注册而不会发生 URL 冲突。
有关完整的详细信息,请参阅 定义 URL 命名空间 的文档。
GeoDjango
在 Django 1.1 中,GeoDjango(即 django.contrib.gis
) 有几个新功能:
- 支持 SpatiaLite – SQLite 的空间数据库 – 作为空间后端。
- 地理聚合(
Collect
、Extent
、MakeLine
、Union
)和F
表达式。 - 新的
GeoQuerySet
方法:collect
、geojson
和snap_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
。 如果permanent
是True
,则视图将发出 HTTP 永久重定向(状态代码 301)。 如果False
,视图将发出 HTTP 临时重定向(状态代码 302)。- 为
DateField
和DateTimeField
添加了新的数据库查找类型 -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 做出贡献的提示:
任何级别的贡献——开发代码、编写文档或简单地分类票证和帮助测试提议的错误修正——总是受到欢迎和赞赏。
事情就是这样。