Django 1.8 发行说明 — Django 文档

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

Django 1.8 发行说明

2015 年 4 月 1 日

欢迎使用 Django 1.8!

这些发行说明涵盖了 新功能 ,以及从 Django 1.7 或更旧版本升级时您需要注意的一些 向后不兼容更改 。 我们还 开始了一些功能的弃用过程 ,并且一些功能已经达到了弃用过程的结束,并且 已被删除

如果您要更新现有项目,请参阅 将 Django 升级到更新版本 指南。

Django 1.8 已被指定为 Django 的第二个 长期支持版本 。 它将在发布后至少三年内收到安全更新。 对之前的 LTS Django 1.4 的支持将在 Django 1.8 发布之日起 6 个月后结束。

Python兼容性

Django 1.8 需要 Python 2.7、3.2、3.3、3.4 或 3.5。 我们【X3X】强烈推荐【X23X】,官方只支持各系列的最新版本。

Django 1.8 是第一个支持 Python 3.5 的版本。

由于上游对 Python 3.2 的支持在 2016 年 2 月结束,我们不会在 2016 年年底之后在 Python 3.2 上测试 Django 1.8.x。


Django 1.8 中的新功能

Model._meta API

Django 现在有 Model._meta 的正式 API,提供官方支持的方式来 检索字段 并根据字段 属性 过滤字段。

Model._meta 对象从 0.96 之前的“Magic Removal”时代起就一直是 Django 的一部分——它只是不是一个正式的、稳定的 API。 认识到这一点,我们努力在可能的情况下保持与旧 API 端点的向后兼容性。 但是,不属于新官方 API 的 API 端点已被弃用,最终将被删除。


多个模板引擎

Django 1.8 定义了一个用于集成模板后端的稳定 API。 它包括对 Django 模板语言和 Jinja2 的内置支持。 它支持在同一项目中具有多个引擎的渲染模板。 在 主题指南 中了解有关新功能的更多信息,并查看旧版本文档中的升级说明。


安全增强

django-secure 第三方库的几个特性已经集成到 Django 中。 django.middleware.security.SecurityMiddleware 为请求/响应周期提供了多项安全增强功能。 新的 check --deploy 选项允许您检查生产设置文件以了解提高站点安全性的方法。


新的 PostgreSQL 特定功能

Django 现在有一个包含 PostgreSQL 特定功能扩展的模块,例如 ArrayFieldHStoreFieldRange Fields 和 :lookup:`unaccent`[ X174X] 查找。 文档中提供了功能的完整细分


新数据类型

  • Django 现在有一个 UUIDField 用于存储通用唯一标识符。 它在 PostgreSQL 上存储为本机 uuid 数据类型,在其他后端存储为固定长度的字符字段。 有一个对应的 表单域
  • Django 现在有一个 DurationField 用于存储时间段 - 由 timedelta 在 Python 中建模。 它存储在 PostgreSQL 上的本机 interval 数据类型中,在 Oracle 上存储为 INTERVAL DAY(9) TO SECOND(6),在其他后端存储为微秒的 bigint。 所有后端的日期和时间相关算法也得到了改进。 有一个对应的 表单域


查询表达式、条件表达式和数据库函数

查询表达式 允许您创建、自定义和组合复杂的 SQL 表达式。 这使得 annotate 能够接受聚合以外的表达式。 聚合现在能够引用多个字段,以及执行算术运算,类似于 F() 对象。 order_by() 也获得了接受表达式的能力。

条件表达式 允许您在查询中使用 if ... elif ... else 逻辑。

数据库函数 的集合还包括 CoalesceConcatSubstr 等功能。


TestCase 数据设置

TestCase 已被重构以允许使用事务和保存点在类级别进行数据初始化。 不支持事务的数据库后端,如带有 MyISAM 存储引擎的 MySQL,仍将能够运行这些测试,但不会从改进中受益。 测试现在在两个嵌套的 atomic() 块中运行:一个用于整个类,一个用于每个测试。

  • 类方法 TestCase.setUpTestData() 添加了在类级别设置测试数据的能力。 与使用 setUp() 相比,使用此技术可以加快测试速度。
  • TestCase 内的夹具加载现在对整个 TestCase 执行一次。


小功能

django.contrib.admin

  • ModelAdmin 现在有一个 has_module_permission() 方法来允许限制对管理索引页面上的模块的访问。
  • InlineModelAdmin 现在有一个属性 show_change_link,它支持显示指向内联对象更改表单的链接。
  • 使用 ModelAdmin.list_filter 中的新 django.contrib.admin.RelatedOnlyFieldListFilterlist_filter 选择限制为附加到来自 ModelAdmin 的异物。
  • ModelAdmin.delete_view() 在删除确认页面上显示要删除的对象的摘要。
  • 嵌入在 admin 中的 jQuery 库已升级到 1.11.2 版。
  • 您现在可以指定 AdminSite.site_url 以显示指向前端站点的链接。
  • 您现在可以指定 ModelAdmin.show_full_result_count 来控制是否应在过滤后的管理页面上显示完整的对象计数。
  • AdminSite.password_change() 方法现在有一个 extra_context 参数。
  • 您现在可以通过仅覆盖 AdminSite.has_permission()AdminSite.login_form 来控制谁可以登录管理站点。 base.html 模板有一个新的块 usertools,其中包含用户特定的标题。 新的上下文变量 has_permissionhas_permission() 获取其值,指示用户是否可以访问该站点。
  • 外键下拉菜单现在具有使用弹出窗口更改或删除相关对象的按钮。


django.contrib.admindocs

  • 现在在模型文档字符串中解析 reStructuredText。


django.contrib.auth


django.contrib.gis

  • 一个新的 GeoJSON 序列化器 现在可用。
  • 现在允许包含子查询作为地理查找参数,例如 City.objects.filter(point__within=Country.objects.filter(continent='Africa').values('mpoly'))
  • 当数据库版本为 3.0 或更高版本时,SpatiaLite 后端现在支持 [X36X] 和 Extent 聚合。
  • PostGIS 2 CREATE EXTENSION postgis 和 SpatiaLite SELECT InitSpatialMetaData 初始化命令现在由 :djadmin:`migrate` 自动运行。
  • GDAL 接口现在支持检索 光栅(图像)数据文件 的属性。
  • 在 Django 1.2 中更改的 SpatialRefSysGeometryColumns 的兼容性垫片已被删除。
  • 现在所有与 GDAL 相关的异常都由 GDALException 引发。 以前的 OGRException 已保留以向后兼容,但不应再使用。


django.contrib.sessions

  • 会话 cookie 现在在 flush() 被调用后被删除。


django.contrib.sitemaps


django.contrib.sites


缓存

  • django.core.cache.backends.locmem.LocMemCache 后端的 incr() 方法现在是线程安全的。


密码学


数据库后端

  • MySQL 后端不再从 datetime 值中剥离微秒,因为 MySQL 5.6.4 及更高版本支持小数秒,具体取决于日期时间字段的声明(当 DATETIME 包括小数精度大于 0 时)。 使用 Django 1.8 和 MySQL 5.6.4 及更高版本创建的新日期时间数据库列将支持微秒。 有关更多详细信息,请参阅 MySQL 数据库说明
  • 使用 InnoDB 存储引擎时,MySQL 后端不再为外键创建显式索引,因为 MySQL 已经自动创建了它们。
  • Oracle 后端不再将 connection_persists_old_columns 特性定义为 True。 相反,Oracle 现在将在获取表的描述时包含一个缓存破坏子句。


电子邮件


文件存储

  • Storage.get_available_name()Storage.save() 现在采用 max_length 参数来实现存储级最大文件名长度约束。 超过此参数的文件名将被截断。 这可以防止在将唯一后缀附加到存储上已存在的长文件名时出现数据库错误。 请参阅 弃用说明 ,了解将此参数添加到您的自定义存储类。


表格

  • 表单小部件现在将值为 TrueFalse 的属性渲染为 HTML5 布尔属性。
  • 新的 has_error() 方法允许检查是否发生了特定错误。
  • 如果在表单上定义了 required_css_class,则必填字段的 <label> 标签将在其属性中包含此类。
  • 无序列表 (<ul>) 中非字段错误的呈现现在在其类列表中包含 nonfield,以将它们与特定于字段的错误区分开来。
  • Field 现在接受 label_suffix 参数,它将覆盖表单的 label_suffix。 这允许在每个字段的基础上自定义后缀 - 以前在模板中使用 模板:Form.as p 等快捷方式时无法覆盖表单的 label_suffix
  • SelectDateWidget 现在接受 empty_label 参数,当不需要 DateField 时,它将覆盖顶部列表选项标签。
  • ImageField 被清理和验证后,UploadedFile 对象将有一个额外的 image 属性,其中包含用于检查文件的 Pillow Image 实例是一个有效的图像。 它还将使用 Pillow 确定的图像内容类型更新 UploadedFile.content_type
  • 您现在可以传递一个在实例化 ChoiceField 时返回可迭代选择的可调用对象。


通用视图


国际化

  • :setting:`FORMAT_MODULE_PATH` 现在可以是表示模块路径的字符串列表。 这允许从不同的可重用应用程序导入多个格式模块。 它还允许在您的主要 Django 项目中覆盖这些自定义格式。


日志记录


管理命令

  • 在从命令行调用的管理命令完成其工作后,数据库连接现在总是关闭。
  • 现在还发现了来自其他包格式(如鸡蛋)的命令。
  • 新的 dumpdata --output 选项允许指定写入序列化数据的文件。
  • 新的 makemessages --excludecompilemessages --exclude 选项允许从处理中排除特定的语言环境。
  • :djadmin:`compilemessages` 现在有一个 --use-fuzzy-f 选项,其中包括对编译文件的模糊翻译。
  • loaddata --ignorenonexistent 选项现在会忽略不再存在的模型的数据。
  • :djadmin:`runserver` 现在使用守护线程来更快地重新加载。
  • :djadmin:`inspectdb` 现在输出 Meta.unique_together。 它还能够内省 MySQL 和 PostgreSQL 数据库的 AutoField
  • 当使用 call_command() 调用带有选项的管理命令时,选项名称可以匹配命令行选项名称(没有初始破折号)或最终选项目标变量名称,但在任何一种情况下,结果选项都收到由命令现在总是在命令选项定义中指定的 dest 名称(只要命令使用 argparse 模块)。
  • :djadmin:`dbshell` 命令现在支持 MySQL 的可选 SSL 证书颁发机构设置 (--ssl-ca)。
  • 新的 makemigrations --name 允许为迁移提供自定义名称而不是生成的名称。
  • :djadmin:`loaddata` 命令现在可以防止重复加载装置。 如果 :setting:`FIXTURE_DIRS` 包含重复项或默认夹具目录路径 (app_name/fixtures),则会引发异常。
  • 如果没有创建迁移,新的 makemigrations --exit 选项允许以错误代码退出。
  • 新的 :djadmin:`showmigrations` 命令允许列出项目中的所有迁移及其依赖项。


中间件


迁移


型号

  • Django 现在在 connections.queries 中最多记录 9000 个查询,以防止在调试模式下长时间运行的进程中过度使用内存。
  • 现在有一个模型 Meta 选项可以为模型的所有关系字段定义 默认相关名称
  • 不正式支持跨不同版本的 Django 酸洗模型和查询集(它可能有效,但不能保证)。 一个指定当前 Django 版本的额外变量现在被添加到模型和查询集的腌制状态,当这些对象在与它们被腌制的版本不同的版本中被取消腌制时,Django 会引发 RuntimeWarning
  • 添加了 Model.from_db(),每当使用 ORM 加载对象时,Django 都会使用它。 该方法允许自定义模型加载行为。
  • extra(select={...}) 现在允许您使用 %%s 转义文字 %s 序列。
  • 自定义查找 现在可以使用装饰器模式注册。
  • 新的 Transform.bilateral 属性允许创建双边转换。 当在查找表达式中使用时,这些转换适用于 lhsrhs,为更复杂的查找提供机会。
  • SQL 特殊字符 (, %, _) 现在在模式查找(例如 containsstartswith 等)与右侧的 F() 表达式一起使用。 在这些情况下,转义由数据库执行,这可能会导致涉及嵌套 REPLACE 函数调用的复杂查询。
  • 您现在可以使用 Model.refresh_from_db() 刷新模型实例。
  • 您现在可以使用 Model.get_deferred_fields() 获取模型的延迟字段集。
  • 当主键字段设置为 None 时,现在使用模型字段 default


信号

  • Signal.send_robust() 返回的 (receiver, exception) 元组的异常现在将其回溯附加为 __traceback__ 属性。
  • environ 参数包含来自请求的 WSGI 环境结构,已添加到 request_started 信号中。
  • 您现在可以从 django.core.signals 导入 setting_changed() 信号以避免在非测试情况下加载 django.test。 Django 本身不再这样做。


系统检查框架


模板

  • :tfilter:`urlize` 现在支持在顶级域之后包含字符的仅限域的链接(例如 djangoproject.com/djangoproject.com/download/)。
  • :tfilter:`urlize` 不会将域末尾的感叹号或其查询字符串视为 URL 的一部分(例如 'djangoproject.com!djangoproject.com)
  • 添加了一个 locmem.Loader 类,用于从 Python 字典加载 Django 模板。
  • :ttag:`now` 标签现在可以使用通常的语法将其输出存储在上下文变量中:{% now 'j n Y' as varname %}


请求和响应

  • WSGIRequest 现在尊重以 // 开头的路径。
  • HttpRequest.build_absolute_uri() 方法现在可以正确处理以 // 开头的路径。
  • 如果 :setting:`DEBUG`True 并且请求引发 SuspiciousOperation,则响应将呈现详细的错误页面。
  • QueryDictquery_string 参数现在是可选的,默认为 None,所以现在可以用 QueryDict() 实例化一个空白的 QueryDict QueryDict(None)QueryDict()
  • HttpRequest 对象的 GETPOST 属性现在是 QueryDict 而不是字典,FILES 属性现在是MultiValueDict。 这使此类符合文档和 WSGIRequest
  • 添加了 HttpResponse.charset 属性。
  • WSGIRequestHandler 现在遵循 RFC 将 URI 转换为 IRI,使用 uri_to_iri()
  • HttpRequest.get_full_path() 方法现在可以正确地从统一资源标识符 (URI) 的路径部分转义不安全字符。
  • HttpResponse 现在实现了一些额外的方法,如 getvalue() 以便实例可以用作流对象。
  • 新的 HttpResponse.setdefault() 方法允许设置标头,除非它已经设置。
  • 您可以使用新的 FileResponse 来流式传输文件。
  • 用于条件视图处理的 condition() 装饰器现在支持 If-unmodified-since 标头。


测试


验证器

  • URLValidator 现在支持 IPv6 地址、Unicode 域和包含身份验证数据的 URL。


1.8 中向后不兼容的变化

警告

除了本节中概述的更改之外,请务必查看 弃用计划 中已删除的任何功能。 如果您尚未在给定功能的弃用时间表内更新代码,则其删除可能会显示为向后不兼容的更改。


将未保存的对象分配给关系会引发错误

笔记

为了更轻松地允许在内存中使用模型,此更改在 Django 1.8.4 中恢复并在 model.save() 期间替换为检查。 例如:

>>> book = Book.objects.create(name="Django")
>>> book.author = Author(name="John")
>>> book.save()
Traceback (most recent call last):
...
ValueError: save() prohibited to prevent data loss due to unsaved related object 'author'.

在 Django 1.8.5 中删除了对反转一对一关系的赋值的类似检查。


将未保存的对象分配给 ForeignKeyGenericForeignKeyOneToOneField 现在会引发 ValueError

以前,未保存对象的分配将被静默忽略。 例如:

>>> book = Book.objects.create(name="Django")
>>> book.author = Author(name="John")
>>> book.author.save()
>>> book.save()

>>> Book.objects.get(name="Django")
>>> book.author
>>>

现在,将引发错误以防止数据丢失:

>>> book.author = Author(name="john")
Traceback (most recent call last):
...
ValueError: Cannot assign "<Author: John>": "Author" instance isn't saved in the database.

如果您需要允许分配未保存的实例(旧行为)并且不担心数据丢失的可能性(例如 您永远不会将对象保存到数据库中),您可以使用 ForeignKey.allow_unsaved_instance_assignment 属性禁用此检查。 (此属性已在 1.8.4 中删除,因为它不再相关。)


仅接受位置参数的管理命令

如果您编写了一个只接受位置参数的自定义管理命令并且您没有指定 args 命令变量,您可能会收到类似 Error: unrecognized arguments: ... 的错误,因为变量解析现在基于 [ X217X] 不隐式接受位置参数。 您可以通过简单地设置 args 类变量来使您的命令向后兼容。 但是,如果您不必保持与旧 Django 版本的兼容性,最好实现新的 add_arguments() 方法,如 编写自定义 django-admin 命令 中所述。


通过测试运行器自定义测试管理命令参数

通过测试运行器向 test 管理命令添加自定义参数的方法已更改。 以前,您可以在测试运行器上提供 option_list 类变量以添加更多参数(如 optparse)。 现在要实现相同的行为,您必须在测试运行器上创建一个 add_arguments(cls, parser) 类方法并调用 parser.add_argument 来添加任何自定义参数,因为解析器现在是一个 argparse.ArgumentParser 实例.


模型检查确保自动生成的列名在数据库指定的限制内

比数据库支持的列名长度长的字段名可能会产生问题。 例如,对于 MySQL,您将在尝试创建列时遇到异常,而对于 PostgreSQL,列名会被数据库截断(您可能会在 PostgreSQL 日志中看到警告)。

引入了模型检查,以便在实际创建数据库表之前更好地提醒用户注意这种情况。

如果您有一个现有模型,该检查似乎是误报,例如在名称已被截断的 PostgreSQL 上,只需使用 db_column 指定正在使用的名称。

该检查也适用于在隐式 ManyToManyField.through 模型中生成的列。 如果您在那里遇到问题,请使用 创建显式模型,然后根据需要在其列上指定 db_column


查询关系查找现在检查对象类型

查询模型查找现在检查传递的对象是否是正确的类型,如果不是,则引发 ValueError。 以前,Django 并不关心对象的类型是否正确; 它只是使用了对象的相关字段属性(例如 id) 用于查找。 现在,会引发错误以防止不正确的查找:

>>> book = Book.objects.create(name="Django")
>>> book = Book.objects.filter(author=book)
Traceback (most recent call last):
...
ValueError: Cannot query "<Book: Django>": Must be "Author" instance.

默认 EmailField.max_length 增加到 254

旧的默认 75 个字符 max_length 无法存储所有可能的符合 RFC3696/5321 的电子邮件地址。 为了存储所有可能的有效电子邮件地址,max_length 已增加到 254 个字符。 您需要为受影响的模型生成并应用数据库迁移(如果您希望保持当前字段的长度,则添加 max_length=75)。 包括 django.contrib.auth.models.User.email 的迁移。


支持早于 9.0 的 PostgreSQL 版本

PostgreSQL 8.4 的上游支持期已于 2014 年 7 月结束。 因此,Django 1.8 将 9.0 设置为它正式支持的最低 PostgreSQL 版本。

这还包括放弃对 PostGIS 1.3 和 1.4 的支持,因为 8.4 之后的 PostgreSQL 版本不支持这些版本。

Django 现在还需要使用 Psycopg2 2.4.5 或更高版本(如果你想使用 django.contrib.postgres,则需要 2.5+)。


支持早于 5.5 的 MySQL 版本

MySQL 5.0 的上游支持期结束于 2012 年 1 月,MySQL 5.1 的上游支持期结束于 2013 年 12 月。 因此,Django 1.8 将 5.5 设置为它正式支持的最低 MySQL 版本。


支持早于 11.1 的 Oracle 版本

Oracle 9.2 于 2010 年 7 月、Oracle 10.1 于 2012 年 1 月和 Oracle 10.2 于 2013 年 7 月结束了上游支持期。 因此,Django 1.8 将 11.1 设置为它正式支持的最低 Oracle 版本。


用于 Oracle 测试的特定特权而不是角色

早期版本的 Django 将 CONNECT 和 RESOURCE 角色授予 Oracle 上的测试用户。 这些角色已被弃用,因此 Django 1.8 改为使用特定的底层权限。 这会更改主用户运行测试所需的权限(除非将项目配置为避免创建测试用户)。 现在所需的确切权限在 Oracle 说明 中有详细说明。


AbstractUser.last_login 允许空值

AbstractUser.last_login 字段现在允许空值。 以前,它默认为创建用户的时间,如果用户从未登录,则会产生误导。 如果您使用默认用户 (django.contrib.auth.models.User),请运行 contrib.auth 中包含的数据库迁移。

如果您使用继承自 AbstractUser 的自定义用户模型,则需要运行 :djadmin:`makemigrations` 并为包含该模型的应用生成迁移。 此外,如果希望为尚未登录的用户设置 last_loginNULL,您可以运行此查询:

from django.db import models
from django.contrib.auth import get_user_model
from django.contrib.auth.models import AbstractBaseUser

UserModel = get_user_model()
if issubclass(UserModel, AbstractBaseUser):
    UserModel._default_manager.filter(
        last_login=models.F('date_joined')
    ).update(last_login=None)

django.contrib.gis

  • 已取消对 GEOS 3.1 和 GDAL 1.6 的支持。
  • 已取消对 SpatiaLite < 2.4 的支持。
  • 特定于 GIS 的查找已重构为使用 django.db.models.Lookup API。
  • GEOSGeometry 对象的默认 str 表示已从 WKT 更改为 EWKT 格式(包括 SRID)。 由于此表示用于序列化框架,这意味着 dumpdata 输出现在将包含几何对象的 SRID 值。


TemplateResponse 上下文处理器的优先级与 render 保持一致

TemplateResponse 构造函数旨在替代 render() 函数。 但是,它有一点不兼容,因为对于 TemplateResponse,传入的上下文字典中的上下文数据可能会被上下文处理器返回的上下文数据所掩盖,而对于 render 则相反大约。 这是一个错误,render 的行为更合适,因为它允许在视图中本地覆盖全局定义的上下文处理器。 如果您依赖 TemplateResponse 中的事实上下文数据可以使用上下文处理器覆盖,则需要更改代码。


在测试用例中覆盖 setUpClass / tearDownClass

当用作类装饰器时,装饰器 override_settings()modify_settings() 现在在类级别起作用。 因此,当覆盖 setUpClass()tearDownClass() 时,应始终调用 super 实现。


移除 django.contrib.formtools

formtools contrib 应用程序已移至单独的包中,并且相关文档页面已更新或删除。

新包在 GitHub 和 PyPI 上可用


测试之间的数据库连接重新加载

Django 之前关闭了 TestCase 中每个测试之间的数据库连接。 这不再是这种情况,因为 Django 现在将整个 TestCase 包装在一个事务中。 如果您的某些测试依赖于旧行为,您应该让它们从 TransactionTestCase 继承。


django.template 命名空间的清理

如果您一直依赖于 django.template 模块中公开的私有 API,则可能必须改为从 django.template.base 导入它们。

还删除了私有 API django.template.base.compile_string()django.template.loader.find_template()django.template.loader.get_template_from_string()


model 私有模型关系的属性

在早期版本的 Django 中,在具有反向外键关系的模型上(例如),model._meta.get_all_related_objects() 将关系作为 django.db.models.related.RelatedObject 返回,并将 model 属性设置为源的关系。 现在,此方法将关系返回为 django.db.models.fields.related.ManyToOneRel(私有 API RelatedObject 已被删除),并且 model 属性设置为关系的目标而不是源。 可在 related_model 属性上访问源模型。

考虑 Django 1.8 教程中的这个例子:

>>> p = Poll.objects.get(pk=1)
>>> p._meta.get_all_related_objects()
[<ManyToOneRel: polls.choice>]
>>> p._meta.get_all_related_objects()[0].model
<class 'polls.models.Poll'>
>>> p._meta.get_all_related_objects()[0].related_model
<class 'polls.models.Choice'>

并将其与旧版本的行为进行比较:

>>> p._meta.get_all_related_objects()
[<RelatedObject: polls:choice related to poll>]
>>> p._meta.get_all_related_objects()[0].model
<class 'polls.models.Choice'>

要访问源模型,您可以使用这样的模式来编写适用于 Django 1.8 和旧版本的代码:

for relation in opts.get_all_related_objects():
    to_model = getattr(relation, 'related_model', relation.model)

另请注意,get_all_related_objects() 在 1.8 中已弃用。


数据库后端API

记录了对数据库后端 API 的以下更改,以帮助编写第三方后端的人员更新其代码:

  • BaseDatabaseXXX 类已移至 django.db.backends.base。 请从新位置导入它们:

    from django.db.backends.base.base import BaseDatabaseWrapper
    from django.db.backends.base.client import BaseDatabaseClient
    from django.db.backends.base.creation import BaseDatabaseCreation
    from django.db.backends.base.features import BaseDatabaseFeatures
    from django.db.backends.base.introspection import BaseDatabaseIntrospection
    from django.db.backends.base.introspection import FieldInfo, TableInfo
    from django.db.backends.base.operations import BaseDatabaseOperations
    from django.db.backends.base.schema import BaseDatabaseSchemaEditor
    from django.db.backends.base.validation import BaseDatabaseValidation
  • data_typesdata_types_suffixdata_type_check_constraints 属性已从 DatabaseCreation 类移至 DatabaseWrapper

  • SQLCompiler.as_sql() 方法现在采用 subquery 参数(:ticket:`24164`)。

  • BaseDatabaseOperations.date_interval_sql() 方法现在只需要一个 timedelta 参数。


django.contrib.admin

  • AdminSite 不再需要 app_name 参数,其 app_name 属性已被删除。 应用程序名称始终为 admin(与您仍然可以使用 AdminSite(name="...") 自定义的实例名称相反。
  • ModelAdmin.get_object() 方法(私有 API)现在采用名为 from_field 的第三个参数,以指定哪个字段应与提供的 object_id 匹配。
  • ModelAdmin.response_delete() 方法现在采用名为 obj_id 的第二个参数,它是用于在删除前检索对象的序列化标识符。


django.template.defaultfilters 中函数的默认自动转义

为了使内置模板过滤器在 Python 代码中调用时输出 HTML “默认安全”,django.template.defaultfilters 中的以下函数已更改为自动转义其输入值:

  • join
  • linebreaksbr
  • linebreaks_filter
  • linenumbers
  • unordered_list
  • urlize
  • urlizetrunc

如果您传递受信任的内容,您可以通过指定 autoescape=False 来恢复旧行为。 在模板中使用相应的过滤器时,此更改没有任何影响。


杂项

  • connections.queries 现在是只读属性。

  • 仅当数据库连接是同一个对象时才认为它们是相等的。 它们不再是可散列的。

  • GZipMiddleware 用于在请求来自 Internet Explorer 时禁用某些内容类型的压缩,以解决 IE6 及更早版本中的错误。 此行为可能会影响 IE7 及更高版本的性能。 它被移除了。

  • URLField.to_python 不再向无路径 URL 添加尾部斜杠。

  • :tfilter:`length` 模板过滤器现在为未定义的变量返回 0,而不是空字符串。

  • ForeignKey.default_error_message['invalid'] 已从 '%(model)s instance with pk %(pk)r does not exist.' 更改为 '%(model)s instance with %(field)s %(value)r does not exist.' 如果您在自己的代码中使用此消息,请更新内插参数列表。 在内部,Django 将继续在 params 中提供 pk 参数以实现向后兼容性。

  • UserCreationForm.error_messages['duplicate_username'] 不再使用。 如果您希望自定义该错误消息,请使用 Meta.error_messages['username'] 中的 'unique'在表单 上覆盖它,或者,如果您有 的自定义表单字段[ X159X],在其 error_messages 参数中使用 'unique' 键。

  • django.contrib.adminbase.html 模板中的块 usertools 现在需要设置 has_permission 上下文变量。 如果您有任何使用此模板的自定义管理视图,请更新它们以将 AdminSite.has_permission() 作为此新变量的值传递,或者仅在上下文中包含 AdminSite.each_context(request) .

  • ClearableFileInput 小部件进行了内部更改以允许更多自定义。 未记录的 url_markup_template 属性被移除,取而代之的是 template_with_initial

  • 为了与其他主要供应商保持一致,en_GB 语言环境现在将星期一作为一周的第一天。

  • 秒已从在 TIME_FORMATDATETIME_FORMATSHORT_DATETIME_FORMAT 中的任何语言环境中删除。

  • Oracle 测试表空间的默认最大大小已从 300M(或 200M,1.7.2 之前)增加到 500M。

  • reverse()reverse_lazy() 现在返回 Unicode 字符串而不是字节字符串。

  • CacheClass 垫片已从所有缓存后端中删除。 提供这些别名是为了与 Django 1.3 向后兼容。 如果您仍在使用它们,请更新您的项目以使用在 :设置:`后端 ` 的关键 :设置:`缓存` 环境。

  • 默认情况下,call_command() 现在总是跳过检查框架(除非你通过它 skip_checks=False)。

  • 遍历行时,File 现在使用 通用换行符 。 以下被认为是行尾:Unix 行尾约定 '\n'、Windows 约定 '\r\n' 和旧的 Macintosh 约定 '\r'

  • 如果 set() 失败,Memcached 缓存后端 MemcachedCachePyLibMCCache 将删除一个键。 这是确保 cache_db 会话存储始终获取最新会话数据所必需的。

  • 删除了 django.test.utils 中的私有 API override_template_loadersoverride_with_test_loader。 用 override_settings 替代 TEMPLATES

  • :setting:`DEBUG`True 时,来自 MySQL 数据库后端的警告不再转换为异常。

  • HttpRequest 现在有一个简化的 repr(例如 <WSGIRequest: GET '/somepath/'>)。 这不会改变 SafeExceptionReporterFilter 类的行为。

  • 当指定了 fieldsform_class 属性时,使用 ModelFormMixin 的基于类的视图将引发 ImproperlyConfigured 异常。 以前,fields 被默默忽略。

  • 在跟踪重定向时,如果测试客户端检测到循环或达到最大重定向限制(而不是静默传递),它现在会引发 RedirectCycleError

  • 设置为字段的 default 参数的可翻译字符串稍后会转换为具体字符串,因此在某些情况下 Field.get_default() 的返回类型是不同的。 作为可调用结果的默认值没有更改。

  • GenericIPAddressField.empty_strings_allowed 现在是 False。 将空字符串解释为空的数据库后端(Django 包含的后端中只有 Oracle)将不再将空值转换回空字符串。 这与其他后端一致。

  • BaseCommand.leave_locale_alone 属性为 False 时,现在停用翻译,而不是强制使用“en-us”语言环境。 如果您的模型包含非英语字符串并且您指望在管理命令中激活英语翻译,这种情况将不再发生。 迁移到 1.8 后可能会生成(一次)新的数据库迁移。

  • django.utils.translation.get_language() 现在在翻译暂时停用时返回 None 而不是 :setting:`LANGUAGE_CODE`

  • 当特定文字不存在翻译时,回退现在取自 :setting:`LANGUAGE_CODE` 语言(而不是未翻译的 msgid 消息)。

  • django.contrib.contenttypes.models.ContentTypename 字段已被迁移删除并替换为属性。 这意味着无法再通过此字段查询或过滤 ContentType

    如果您升级到 Django 1.8 并跳过 Django 1.7,请小心。 如果您运行 manage.py migrate --fake,此迁移将被跳过,您将看到 RuntimeError: Error creating new content types. 异常,因为 name 列不会从数据库中删除。 使用 manage.py migrate --fake-initial 仅伪造初始迁移。

  • 新的 migrate --fake-initial 选项允许伪造初始迁移。 在 1.7 中,如果初始迁移中创建的所有表都已存在,则初始迁移总是会自动伪造。

  • 现在,在迁移数据库或运行测试时,没有 的应用程序 迁移和 ForeignKey 迁移到应用程序 迁移可能会导致外键约束错误。 在 Django 1.7 中,这可能会以静默方式失败并导致缺少约束。 要解决该错误,请在没有迁移的情况下向应用程序添加迁移。


1.8 中弃用的功能

django.db.models.options.Options中选择的方法

作为 Model._meta API(来自 django.db.models.options.Options 类)形式化的一部分,许多方法已被弃用,并将在 Django 1.10 中删除:

  • get_all_field_names()
  • get_all_related_objects()
  • get_all_related_objects_with_model()
  • get_all_related_many_to_many_objects()
  • get_all_related_m2m_objects_with_model()
  • get_concrete_fields_with_model()
  • get_field_by_name()
  • get_fields_with_model()
  • get_m2m_with_model()


从 future 库加载 cycle 和 firstof 模板标签

Django 1.6 引入了 {% load cycle from future %}{% load firstof from future %} 语法来向前兼容 :ttag:`cycle`:ttag:`firstof` 模板标签。 此语法现已弃用,并将在 Django 1.10 中删除。 您可以简单地删除 {% load ... from future %} 标签。


django.conf.urls.patterns()

在 Django 的旧时代,鼓励在 urlpatterns 中将视图作为字符串引用:

urlpatterns = patterns('',
    url('^$', 'myapp.views.myview'),
)

并且 Django 会在内部神奇地导入 myapp.views.myview 并将字符串转换为真正的函数引用。 为了在引用来自同一模块的多个视图时减少重复,patterns() 函数需要一个必需的初始 prefix 参数,该参数附加到该组 urlpatterns

urlpatterns = patterns('myapp.views',
    url('^$', 'myview'),
    url('^other/$', 'otherview'),
)

在现代,我们更新了教程,改为推荐导入您的视图模块并直接引用您的视图函数(或类)。 这有许多优点,所有这些都源于我们使用普通 Python 代替“Django String Magic”的事实:错误输入视图名称时的错误不那么模糊,IDE 可以帮助自动完成视图名称等。

所以现在,prefix arg 的上述使用更有可能被写成(并且更好地写成):

from myapp import views

urlpatterns = patterns('',
    url('^$', views.myview),
    url('^other/$', views.otherview),
)

因此,patterns() 没有什么用处,而且在教新用户时是一种负担(回答新手的问题“为什么我需要这个空字符串作为 patterns() 的第一个参数?”)。 由于这些原因,我们正在弃用它。 更新代码就像确保 urlpatternsdjango.conf.urls.url() 实例的列表一样简单。 例如:

from django.conf.urls import url
from myapp import views

urlpatterns = [
    url('^$', views.myview),
    url('^other/$', views.otherview),
]

将字符串作为 view 传递给 url()

与上一项相关,不推荐在 url() 函数中将视图作为字符串引用。 改为传递上一节所述的可调用视图。


django.core.context_processors

内置模板上下文处理器已移至 django.template.context_processors


django.test.SimpleTestCase.urls

用于在测试中指定 URLconf 配置的属性 SimpleTestCase.urls 已被弃用,并将在 Django 1.10 中删除。 改用 @override_settings(ROOT_URLCONF=...)


prefix 参数 i18n_patterns()

与上一项相关,django.conf.urls.i18n.i18n_patterns()prefix 参数已被弃用。 只需传递 django.conf.urls.url() 实例的列表。


在 :ttag:`for` 模板标签中使用了不正确的解压值计数

:ttag:`for` 标签中使用不正确的解压值计数将引发异常,而不是在 Django 1.10 中静默失败。


将虚线路径传递给 reverse() 和 :ttag:`url`

通过 Python 路径反转 URL 是一项昂贵的操作,因为它会导致导入被反转的路径。 此行为还导致了 安全问题 。 使用 命名的 URL 模式 来代替。

如果您使用 django.contrib.sitemaps,请将 name 参数添加到引用 django.contrib.sitemaps.views.sitemap()[ X154X]:

from django.contrib.sitemaps.views import sitemap

url(r'^sitemap\.xml$', sitemap, {'sitemaps': sitemaps},
    name='django.contrib.sitemaps.views.sitemap')

在 Django 1.10 中删除了通过 Python 路径反转时的兼容性。

同样对于 GIS 站点地图,添加 name='django.contrib.gis.sitemaps.views.kml'name='django.contrib.gis.sitemaps.views.kmz'

如果您为 :setting:`LOGIN_URL`:setting:`LOGIN_REDIRECT_URL` 设置使用 Python 路径,请改用 url() 的名称。


聚合方法和模块

django.db.models.sql.aggregatesdjango.contrib.gis.db.models.sql.aggregates 模块(均为私有 API)已被弃用,因为 django.db.models.aggregatesdjango.contrib.gis.db.models.aggregates 现在也负责 SQL 生成。 旧模块将在 Django 1.10 中删除。

如果您使用的是旧模块,请参阅 查询表达式 以获取有关使用新的稳定 API 重写自定义聚合的说明。

django.db.models.sql.query.Query 的以下方法和属性也已弃用,Django 1.10 中将删除向后兼容性垫片:

  • Query.aggregates,替换为 annotations
  • Query.aggregate_select,替换为 annotation_select
  • Query.add_aggregate(),替换为 add_annotation()
  • Query.set_aggregate_mask(),替换为 set_annotation_mask()
  • Query.append_aggregate_mask(),替换为 append_annotation_mask()


通过 Command.option_list 扩展管理命令参数

管理命令现在使用 argparse 而不是 optparse 来解析传递给命令的命令行参数。 这也意味着向命令添加自定义参数的方式已更改:您现在应该覆盖 add_arguments() 方法并通过 argparse.add_argument()。 有关更多详细信息,请参阅 此示例


django.core.management.NoArgsCommand

NoArgsCommand 现在已弃用,并将在 Django 1.10 中删除。 使用 BaseCommand 代替,默认情况下不接受任何参数。


列出项目中的所有迁移

:djadmin:`migrate` 管理命令的 --list 选项已弃用,将在 Django 1.10 中删除。 改用 :djadmin:`showmigrations`


ModelChoiceField 和 ModelMultipleChoiceField 的 cache_choices 选项

ModelChoiceFieldModelMultipleChoiceField 采用了一个未记录、未经测试的选项 cache_choices。 这个缓存的查询集在同一个 Form 对象的多个渲染之间。 此选项会加速弃用,并将在 Django 1.9 中删除。


django.template.resolve_variable()

该功能已被非正式地标记为“已弃用”一段时间。 将 resolve_variable(path, context) 替换为 django.template.Variable(path).resolve(context)


django.contrib.webdesign

它提供了 :ttag:`lorem` 模板标签,现在包含在内置标签中。 只需从模板中删除 'django.contrib.webdesign':setting:`INSTALLED_APPS` 和 {% load webdesign %}


error_message 参数到 django.forms.RegexField

它为 1.0 之前的代码提供了向后兼容性,但其功能是多余的。 请改用 Field.error_messages['invalid']


旧的 :tfilter:`unordered_list` 语法

:tfilter:`unordered_list` 模板过滤器的旧版(1.0 之前)、更严格、更详细的输入格式已被弃用:

['States', [[../'Kansas', [['Lawrence', []], ['Topeka', []]]], ['Illinois', []]]]

使用新语法,这变成:

['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']]

django.forms.Field._has_changed()

通过删除前导下划线将此方法重命名为 has_changed()。 旧名称在 Django 1.10 之前仍然有效。


django.utils.html.remove_tags() 和 removetags 模板过滤器

django.utils.html.remove_tags() 以及模板过滤器 removetags 已被弃用,因为它们不能保证安全输出。 它们的存在可能会导致它们在实际上并不安全的安全敏感环境中使用。

未使用和未记录的 django.utils.html.strip_entities() 函数也已弃用。


is_admin_site 参数到 django.contrib.auth.views.password_reset()

这是一个不再需要的遗留选项。


SubfieldBase

django.db.models.fields.subclassing.SubfieldBase 已被弃用,将在 Django 1.10 中移除。 从历史上看,它用于处理从数据库加载时需要类型转换的字段,但未在 .values() 调用或聚合中使用。 它已被替换为 from_db_value()

新方法不像 SubfieldBase 那样在赋值时调用 to_python() 方法。 如果您需要这种行为,请在您的项目中重新实现 Django 源代码 中的 Creator


django.utils.checksums

django.utils.checksums 模块已被弃用,将在 Django 1.10 中删除。 它提供的功能(使用 Luhn 算法验证校验和)没有记录,也没有在 Django 中使用。 该模块已移至 django-localflavor 包(版本 1.1+)。


InlineAdminForm.original_content_type_id

InlineAdminForm 上的 original_content_type_id 属性已被弃用,并将在 Django 1.10 中删除。 历史上,它被用来构建“现场查看”URL。 现在可以使用表单的 absolute_url 属性访问此 URL。


django.views.generic.edit.FormMixin.get_form() 的 form_class 参数

FormMixin 覆盖 get_form() 方法的子类应确保为 form_class 参数提供默认值,因为它现在是可选的。


get_template() 加载的渲染模板,带有 Context

get_template() 的返回类型在 Django 1.8 中发生了变化:代替 django.template.Template,它返回一个 Template 实例,其确切类型取决于哪个后端加载它。

这两个类都提供了 render() 方法,但是,前者将 django.template.Context 作为参数,而后者需要 dict。 此更改是通过 Django 模板的弃用路径强制执行的。

所有这些也适用于 select_template()


Template 和 Context 模板响应中的类

SimpleTemplateResponseTemplateResponse 的一些方法接受 django.template.Contextdjango.template.Template 对象作为参数。 他们现在应该分别接收 dict 和后端相关的模板对象。

如果您对任一模板响应类进行了子类化,这也适用于返回类型。

查看 模板响应 API 文档 了解详细信息。


渲染函数的 dictionary 和 context_instance 参数

以下函数将不再接受 Django 1.10 中的 dictionarycontext_instance 参数:

  • django.shortcuts.render()
  • django.shortcuts.render_to_response()
  • django.template.loader.render_to_string()

请改用 context 参数。 当 dictionary 作为位置参数传递时,这是最常见的习惯用法,不需要更改。

如果您在 context_instance 中传递 Context,请改为在 context 参数中传递 dict。 如果您要传递 RequestContext,请在 request 参数中单独传递请求。


dirs 模板查找函数的参数

以下函数将不再接受 dirs 参数来覆盖 Django 1.10 中的 TEMPLATE_DIRS

该参数在不同的模板加载器中无法一致地工作,并且不适用于包含的模板。


django.template.loader.BaseLoader

django.template.loader.BaseLoader 更名为 django.template.loaders.base.Loader。 如果您编写了继承 BaseLoader 的自定义模板加载器,则必须改为继承 Loader


django.test.utils.TestTemplateLoader

私有 API django.test.utils.TestTemplateLoader 已弃用,取而代之的是 django.template.loaders.locmem.Loader,并将在 Django 1.9 中删除。


支持自定义 Storage 类上的 max_length 参数

Storage 子类应该将 max_length=None 作为参数添加到 get_available_name() 和/或 save() 如果它们覆盖任一方法。 Django 1.10 中将删除对不接受此参数的存储的支持。


qn 替换为 compiler

在以前的 Django 版本中,各种内部 ORM 方法(主要是 as_sql 方法)接受 qn(用于“引用名称”)参数,该参数是对引用标识符的函数的引用,用于发送到数据库。 在 Django 1.8 中,该参数已重命名为 compiler,现在是一个完整的 SQLCompiler 实例。 为了向后兼容,调用 SQLCompiler 实例执行与 qn 函数所使用的相同的名称引用。 然而,这个向后兼容的 shim 立即被弃用:你应该将你的 qn 参数重命名为 compiler,并在你之前调用 qn(...) 的地方调用 compiler.quote_name_unless_alias(...)


RedirectView.permanent 默认值

RedirectView.permanent 属性的默认值在 Django 1.9 中将从 True 更改为 False


使用 AuthenticationMiddleware 不使用 SessionAuthenticationMiddleware

django.contrib.auth.middleware.SessionAuthenticationMiddleware 是在 Django 1.7 中添加的。 在 Django 1.7.2 中,它的功能被移到 auth.get_user() 并且为了向后兼容,只有当 'django.contrib.auth.middleware.SessionAuthenticationMiddleware' 出现在 MIDDLEWARE_CLASSES 中时才启用。

在 Django 1.10 中,无论是否启用 SessionAuthenticationMiddleware 都会启用会话验证(此时 SessionAuthenticationMiddleware 将没有意义)。 您可以在此之前的某个时间将其添加到您的 MIDDLEWARE_CLASSES 以选择加入。 请先阅读【X16X】升级注意事项【X42X】。


django.contrib.sitemaps.FlatPageSitemap

django.contrib.sitemaps.FlatPageSitemap 已移至 django.contrib.flatpages.sitemaps.FlatPageSitemap。 旧的导入位置已弃用,将在 Django 1.9 中删除。


ssi 模板标签

ssi 模板标签允许通过绝对路径将文件包含在模板中。 这在大多数部署情况下用途有限,:ttag:`include` 标签通常更有意义。 此标签现已弃用,并将在 Django 1.10 中删除。


= 作为 if 模板标签中的比较运算符

使用带有 {% if %} 模板标签的单个等号进行相等测试是没有记录和未经测试的。 现在已弃用,取而代之的是 ==


ModelFormMixin.success_url 中的 %(<foo>)s 语法

ModelFormMixin.success_url 中遗留的 %(<foo>)s 语法已被弃用,并将在 Django 1.10 中删除。


GeoQuerySet 聚合方法

collect()extent()extent3d()make_line()unionagg() 聚合方法已弃用,应替换为基于函数的聚合等效项(CollectExtentExtent3DMakeLineUnion)。


allow_migrate路由器方法的签名

数据库路由器的allow_migrate()方法的签名从allow_migrate(db, model)变成了allow_migrate(db, app_label, model_name=None, **hints)

设置 model_name 后,以前通过 model 位置参数给出的值现在可以在 hints 字典中的 'model' 键下找到。

切换到新签名后,路由器也将被 RunPythonRunSQL 操作调用。


1.8 中删除的功能

这些功能已达到弃用周期的终点,并在 Django 1.8 中删除。 有关详细信息,包括如何删除这些功能的使用,请参阅 1.6 中弃用的功能。

  • django.contrib.comments 被移除。
  • 删除了以下事务管理 API:
    • TransactionMiddleware
    • 装饰器和上下文管理器 autocommitcommit_on_successcommit_manually,在 django.db.transaction 中定义
    • 函数 commit_unless_managedrollback_unless_managed,也在 django.db.transaction 中定义
    • TRANSACTIONS_MANAGED 设置
  • :ttag:`cycle`:ttag:`firstof` 模板标签自动转义它们的参数。
  • SEND_BROKEN_LINK_EMAILS 设置被删除。
  • django.middleware.doc.XViewMiddleware 被移除。
  • Model._meta.module_name 别名被删除。
  • 为重命名 get_query_set 而引入的向后兼容垫片和类似的查询集方法被删除。 这会影响以下类别:BaseModelAdminChangeListBaseCommentNodeGenericForeignKeyManagerSingleRelatedObjectDescriptorReverseSingleRelatedObjectDescriptor
  • 删除了为重命名属性 ChangeList.root_query_setChangeList.query_set 而引入的向后兼容垫片。
  • django.views.defaults.shortcutdjango.conf.urls.shortcut 被移除。
  • 删除了对 Python Imaging Library (PIL) 模块的支持。
  • 删除了以下私有 API:
    • django.db.backend
    • django.db.close_connection()
    • django.db.backends.creation.BaseDatabaseCreation.set_autocommit()
    • django.db.transaction.is_managed()
    • django.db.transaction.managed()
  • django.forms.widgets.RadioInput 被移除。
  • 移除了模块 django.test.simple 和类 django.test.simple.DjangoTestSuiteRunner
  • 模块 django.test._doctest 被移除。
  • CACHE_MIDDLEWARE_ANONYMOUS_ONLY 设置被删除。 尽管 django.middleware.cache.CacheMiddlewaredjango.middleware.cache.UpdateCacheMiddleware 没有弃用警告,但此更改会影响后者。
  • 使用硬编码 在 Mac 上按住“Control”或“Command”选择多个. 字符串以覆盖或附加到用户提供的 help_text 表单中ManyToMany 模型字段不再由 Django 在模型或表单层执行。
  • Model._meta.get_(add|change|delete)_permission 方法被删除。
  • 为了向后兼容,不再读取会话密钥 django_language
  • 地理站点地图被删除(django.contrib.gis.sitemaps.views.indexdjango.contrib.gis.sitemaps.views.sitemap)。
  • django.utils.html.fix_ampersandsfix_ampersands 模板过滤器和 django.utils.html.clean_html 被删除。