Django 1.1发行说明

2009年7月29日

欢迎来到Django 1.1!

django 1.1包含了许多漂亮的 new features ,大量的错误修复,以及从django 1.0轻松升级的路径。

1.1中的向后不兼容更改

Django的政策是 API stability . 这意味着,通常情况下,针对django 1.0开发的代码应该继续针对1.1不变的代码工作。但是,如果需要解决bug,我们有时会进行向后不兼容的更改,并且在django 1.0和django 1.1之间有一些这样的(小的)更改。

在升级到Django1.1之前,您应该仔细检查以下更改是否不会影响您,如果影响,则升级代码。

对约束名称的更改

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

如果您使用的是32位平台,那么您就不必担心了;您将不会看到由于这种变化而产生的任何差异。

然而, users on 64-bit platforms may experience some problems 使用 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 ...

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

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

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

Django1.1在事务内部运行测试,允许更好的测试性能(请参见 test performance improvements 详情请参阅。

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

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

远离的 SetRemoteAddrFromForwardedFor 中间件

为了方便起见,Django1.0包含了一个可选的中间件类-- django.middleware.http.SetRemoteAddrFromForwardedFor --它更新了 REMOTE_ADDR 基于HTTP X-Forwarded-For 头通常由一些代理配置设置。

已经证明,这种机制不能足够可靠地用于一般用途,并且(尽管文档相反)将其包含在Django中可能会导致应用程序开发人员假定 REMOTE_ADDR 是“安全的”,或者在某种程度上是可靠的身份验证来源。

虽然不是直接的安全问题,但我们已经决定用django 1.1版本删除这个中间件。它已经被一个类所取代,该类除了提升 DeprecationWarning .

如果您一直依赖于此中间件,最简单的升级路径是:

  • 检查 `the code as it existed before it was removed`_ _.

  • 验证它是否与您的上游代理正确工作,修改它以支持您的特定代理(如有必要)。

  • 介绍您的修改版本 SetRemoteAddrFromForwardedFor 作为您自己项目中的中间件。

上载文件的名称稍后可用

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

在django 1.1中,该文件是作为将模型保存到数据库中的一部分保存的,因此磁盘上使用的实际文件名直到 之后 模型已保存。

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

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

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

修正了 join 筛选器的转义行为

这个 join 筛选器不再对为连接器传入的文本值进行转义。

对于包含五个特殊HTML字符之一的文本字符串的特殊情况,这是向后不兼容的。因此,如果你在写作 {{{{ foo|join:"&" }}}} ,你现在必须写 {{{{ foo|join:"&" }}}} .

以前的行为是一个bug,与文档记录和预期相反。

永久重定向和 redirect_to() 一般视图

Django 1.1增加了 permanent 论据 django.views.generic.simple.redirect_to() 查看。如果您使用的是 redirect_to 使用名为“permanent”的格式字符串键查看,这是非常不可能的。

1.1中不推荐的功能

Django 1.1中有一个功能被标记为已弃用:

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

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

    你应该把它改成:

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

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

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

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

Django 1.1的新功能

相当多:自从Django1.0以来,我们提交了1290个代码,修复了1206个错误,并添加了大约10000行文档。

Django 1.1的主要新功能是:

ORM改进

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

集料支持

现在可以运行SQL聚合查询(即 COUNT()MAX()MIN() 等)。您可以选择直接返回聚合的结果,或者在 QuerySet 以及聚合查询的结果。

此功能作为新功能提供 aggregate()annotate() 方法,并在 the ORM aggregation documentation .

查询表达式

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

模型改进

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

“非托管”模型

现在,您可以控制Django是否使用 managed 模型选项。默认为 True ,这意味着Django将在 syncdb 并将其作为 reset 命令。也就是说,Django 管理 数据库表的生命周期。

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

有关更多详细信息,请参阅 managed 选择权。

代理模型

现在可以创建 proxy models :现有模型的子类,只添加Python级别(而不是数据库级别)行为,不由新表表示。也就是说,新型号是 代理 对于一些底层模型,它存储所有实际数据。

所有详细信息都可以在 proxy models documentation . 此功能在表面上与非托管模型类似,因此文档对 how proxy models differ from unmanaged models .

延迟字段

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

您将使用新的queryset方法来执行此操作 defer()only() .

测试改进

一些显著的改进 testing framework .

测试性能改进

使用Django编写的测试 testing framework 现在运行得快得惊人(很多情况下快10倍)。

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

测试客户端改进

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

  • 测试 Client 现在可以自动跟踪重定向 follow 参数 Client.get()Client.post() . 这使得发布重定向的测试视图更简单。

  • 现在,在返回测试客户机的响应中更容易获得模板上下文:您只需以 request.context[key] . 老一套的方法 request.context 作为上下文列表,继承链中的每个呈现模板都有一个,如果需要的话,它仍然可用。

新的管理功能

Django 1.1为Django的管理界面添加了一些漂亮的新功能:

更改列表中的可编辑字段

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

管理“行动”

现在可以定义 admin actions 它可以对一组模型进行批量操作。用户将能够在“更改列表”页上选择对象,然后将这些批量操作应用于所有选定的对象。

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

条件视图处理

Django现在对 conditional view processing 使用标准 ETagLast-Modified HTTP报头。这意味着您现在可以通过测试成本更低的条件轻松地短路视图处理。对于许多视图,这可能会导致速度的严重提高和带宽的减少。

URL命名空间

Django 1.1改进 named URL patterns 随着url“名称空间”的引入。

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

有关详细信息,请参阅 the documentation on defining URL namespaces .

GeoDjango

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

  • 支持 SpatiaLite --用于sqlite的空间数据库——作为空间后端。

  • 地理聚集体 (CollectExtentMakeLineUnionF 表达。

  • 新的 GeoQuerySet 方法: collectgeojsonsnap_to_grid .

  • 新的列表接口方法 GEOSGeometry 对象。

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

其他改进

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

  • 这个 CSRF protection middleware 已经分成两个班了-- CsrfViewMiddleware 检查传入请求,以及 CsrfResponseMiddleware 处理传出响应。组合的 CsrfMiddleware 类(两者都有)保持向后兼容性,但现在建议使用拆分类,以便对CSRF处理发生的时间和地点进行细粒度控制。

  • reverse() 以及使用它的代码(例如 {{% url %}} 模板标记)现在可以在django的管理站点中使用URL,前提是管理URL是通过 include(admin.site.urls) (将管理请求发送到 admin.site.root 视图仍然可以工作,但是当以这种方式配置时,管理员中的URL将不会“可逆”。

  • 这个 include() django urlconf模块中的函数现在可以接受URL模式序列(由 patterns() )除了模块名。

  • Django窗体的实例(请参见 the forms overview )现在有两种额外的方法, hidden_fields()visible_fields() ,返回隐藏列表——即, <input type="hidden"> --窗体上的可见字段。

  • 这个 redirect_to 通用视图现在接受一个附加的关键字参数 permanent .如果 permanentTrue ,视图将发出HTTP永久重定向(状态代码301)。如果 False ,视图将发出HTTP临时重定向(状态代码302)。

  • 新的数据库查找类型-- week_day --已为添加 DateFieldDateTimeField . 这种类型的查找接受一个介于1(星期日)和7(星期六)之间的数字,并返回字段值与星期几匹配的对象。见 the full list of lookup types 有关详细信息。

  • 这个 {{% for %}} Django模板语言中的标记现在接受一个可选的 {{% empty %}} 子句,显示时间 {{% for %}} 被要求循环一个空序列。见 the list of built-in template tags 举个例子。

  • 这个 dumpdata 管理命令现在接受单个模型名称作为参数,允许您仅从特定模型导出数据。

  • 有一个新的 safeseq 模板过滤器的工作原理 safe 对于列表,将列表中的每个项目标记为安全。

  • Cache backends 现在支持 incr()decr() 用于递增和递减缓存键值的命令。在支持原子增量/减量的缓存后端(尤其是memcached后端),这些操作将是原子的,而且速度非常快。

  • 姜戈现在可以 easily delegate authentication to the web server 通过支持标准的新身份验证后端 REMOTE_USER 用于此目的的环境变量。

  • 有一个新的 django.shortcuts.redirect() 函数,它使给定对象、视图名称或URL的重定向更容易发出。

  • 这个 postgresql_psycopg2 后端现在支持 native PostgreSQL autocommit . 这是一个高级的、特定于PostgreSQL的特性,可以使某些读重应用程序更快。

下一步是什么?

我们将休息片刻,然后Django 1.2的工作将开始--疲倦的人不会休息!如果您愿意提供帮助,关于Django开发的讨论,包括1.2版本的进展,每天都会在|Django-Developers|邮件列表和 #django-dev IRC通道打开 irc.libera.chat 。欢迎加入我们的讨论!

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

任何级别的贡献——开发代码、编写文档或简单地试用罚单,并帮助测试提议的错误修复——都是受欢迎和赞赏的。

就是这样。