2015年4月1日
欢迎来到Django 1.8!
这些发行说明涵盖了 new features 以及一些 backwards incompatible changes 从django 1.7或更旧版本升级时,您需要注意。我们也 begun the deprecation process for some features 和一些特性已经达到了它们的折旧过程的末尾,并且 have been removed .
见 如何将Django升级到更新版本 如果正在更新现有项目,则提供指南。
Django 1.8被指定为Django的第二个 long-term support release .它将在发布后至少三年内收到安全更新。对之前的RTS Django 1.4的支持将在Django 1.8发布之日起6个月内结束。
Django1.8需要python 2.7、3.2、3.3、3.4或3.5。我们 强烈推荐 只有官方支持每个系列的最新版本。
Django1.8是第一个支持Python3.5的版本。
由于2016年2月结束了对python 3.2的上游支持,我们不会在2016年底后在python 3.2上测试django 1.8.x。
Model._meta
API¶Django现在有一个正式的API Model._meta 提供官方支持的方式 retrieve fields 并根据其筛选字段 attributes .
这个 Model._meta
从0.96之前的“魔法移除”时代起,Object就一直是Django的一部分——它不是一个官方的、稳定的API。认识到这一点,我们已经尽力尽可能地保持与旧API端点的向后兼容性。但是,不属于新的官方API的API端点已被弃用,最终将被删除。
Django1.8为集成模板后端定义了一个稳定的API。它包括对django模板语言和 Jinja2
. 它支持在同一个项目中使用多个引擎呈现模板。进一步了解中的新功能 topic guide 并查看旧版本文档中的升级说明。
的几个功能 django-secure 第三方库已集成到Django中。 django.middleware.security.SecurityMiddleware
为请求/响应周期提供多项安全增强功能。新的 check --deploy
选项允许您检查您的生产设置文件,以了解如何提高站点的安全性。
Django现在有一个模块,扩展了PostgreSQL特有的特性,例如 ArrayField
, HStoreField
, 距离场 和 unaccent
查找。功能的完整分解可用 in the documentation .
Django现在有一个 UUIDField
用于存储通用的唯一标识符。它作为本机存储 uuid
PostgreSQL上的数据类型以及其他后端上的固定长度字符字段。有一个对应的 form field
.
Django现在有一个 DurationField
用于存储在python中由 timedelta
. 它存储在本地 interval
PostgreSQL上的数据类型,作为 INTERVAL DAY(9) TO SECOND(6)
在Oracle上,作为 bigint
其他后端的毫秒数。所有后端的日期和时间相关算法也都得到了改进。有一个对应的 form field
.
Query Expressions 允许您创建、自定义和组合复杂的SQL表达式。这使Annotate可以接受聚合以外的表达式。聚合现在可以引用多个字段,也可以执行算术,类似于 F()
对象。 order_by()
也获得了接受表达的能力。
Conditional Expressions 允许您使用 if
… elif
… else
查询中的逻辑。
收藏 database functions 也包括在功能中,例如 Coalesce
, Concat
和 Substr
.
TestCase
数据设置¶TestCase
已重构,以允许使用事务和保存点在类级别初始化数据。不支持事务的数据库后端(如带有myisam存储引擎的mysql)仍然可以运行这些测试,但不会从改进中受益。测试现在在两个嵌套的 atomic()
块:一个用于整个类,一个用于每个测试。
类方法 TestCase.setUpTestData()
添加了在类级别设置测试数据的功能。与使用此技术相比,使用此技术可以加快测试速度 setUp()
。
夹具加载范围 TestCase
现在只执行一次 TestCase
.
django.contrib.admin
¶ModelAdmin
现在有一个 has_module_permission()
方法来限制对管理索引页上模块的访问。
InlineModelAdmin
现在有了一个属性 show_change_link
它支持显示指向内联对象的更改窗体的链接。
使用新的 django.contrib.admin.RelatedOnlyFieldListFilter
在里面 ModelAdmin.list_filter
限制 list_filter
选择与来自 ModelAdmin
.
这个 ModelAdmin.delete_view()
在删除确认页上显示要删除的对象的摘要。
嵌入在管理中的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_permission
,它的值来自 has_permission()
,指示用户是否可以访问该网站。
外键下拉列表现在有按钮,可以使用弹出窗口更改或删除相关对象。
django.contrib.admindocs
¶RestructuredText现在在模型docStrings中进行分析。
django.contrib.auth
¶授权后端现在可以提升 PermissionDenied
在里面 has_perm()
和 has_module_perms()
短路许可检查。
PasswordResetForm
现在有了一个方法 send_mail()
可以覆盖以自定义要发送的邮件。
这个 max_length
属于 Permission.name
已从50个字符增加到255个字符。请运行数据库迁移。
USERNAME_FIELD
和 REQUIRED_FIELDS
现在支持 ForeignKey
S
pbkdf2密码散列器的默认迭代计数增加了33%。这种向后兼容的更改不会影响子类化的用户 django.contrib.auth.hashers.PBKDF2PasswordHasher
更改默认值。
django.contrib.gis
¶一个新的 GeoJSON serializer 现在可用。
例如,现在允许将子查询包含为地理查找参数 City.objects.filter(point__within=Country.objects.filter(continent='Africa').values('mpoly'))
.
空间站点后端现在支持 Collect
和 Extent
当数据库版本为3.0或更高版本时聚合。
PostGIS2 CREATE EXTENSION postgis
还有太空人 SELECT InitSpatialMetaData
初始化命令现在由自动运行 migrate
.
gdal接口现在支持检索 raster (image) data file .
兼容性垫片 SpatialRefSys
和 GeometryColumns
Django 1.2中的更改已删除。
所有与gdal相关的异常现在用引发 GDALException
. 前者 OGRException
为向后兼容而保留,但不应再使用。
django.contrib.sessions
¶会话cookie现在在之后被删除 flush()
被称为。
django.contrib.sitemaps
¶新的 Sitemap.i18n
属性允许您基于 LANGUAGES
设置。
django.contrib.sites
¶get_current_site()
现在将根据查找当前网站 request.get_host()
如果 SITE_ID
未定义设置。
这个 incr()
方法 django.core.cache.backends.locmem.LocMemCache
后端现在是线程安全的。
这个 max_age
的参数 django.core.signing.TimestampSigner.unsign()
方法现在还接受 datetime.timedelta
对象。
MySQL后端不再从 datetime
mysql 5.6.4及更高版本的值支持小数秒,具体取决于datetime字段的声明(当 DATETIME
包括大于0的分数精度)。使用django 1.8和mysql 5.6.4及更高版本创建的新datetime数据库列将支持微秒。见 MySQL database notes 了解更多详细信息。
当使用innodb存储引擎时,mysql后端不再为外键创建显式索引,因为mysql已经自动创建了它们。
Oracle后端不再定义 connection_persists_old_columns
特征为 True
. 相反,在获取表的描述时,Oracle现在将包含一个缓存总线子句。
Email backends 现在支持用于打开和关闭连接的上下文管理器协议。
SMTP电子邮件后端现在支持 keyfile
和 certfile
使用验证 EMAIL_SSL_CERTFILE
和 EMAIL_SSL_KEYFILE
设置。
SMTP EmailBackend
现在支持设置 timeout
参数 EMAIL_TIMEOUT
设置。
EmailMessage
和 EmailMultiAlternatives
现在支持 reply_to
参数。
Storage.get_available_name()
和 Storage.save()
现在采取 max_length
用于实现存储级别最大文件名长度约束的参数。超过此参数的文件名将被截断。这可以防止在将唯一后缀附加到存储中已存在的长文件名时出现数据库错误。见 deprecation note 关于将此参数添加到自定义存储类。
表单小部件现在呈现值为的属性 True
或 False
作为HTML5布尔属性。
新的 has_error()
方法允许检查是否发生了特定错误。
如果 required_css_class
在窗体上定义,然后 <label>
必需字段的标记将在其属性中存在此类。
无序列表中非字段错误的呈现 (<ul>
现在包括 nonfield
在它的类列表中,将它们与特定于字段的错误区分开来。
Field
现在接受 label_suffix
参数,它将重写窗体的 label_suffix
. 这样就可以在每个字段的基础上自定义后缀-以前不可能重写窗体的 label_suffix
使用快捷方式时,如 {{{{ form.as_p }}}}
在模板中。
SelectDateWidget
现在接受一个 empty_label
参数,当 DateField
不是必需的。
后一 ImageField
已经过清洗和验证, UploadedFile
对象将具有附加的 image
包含枕头的属性 Image
用于检查文件是否为有效图像的实例。它还将更新 UploadedFile.content_type
图像的内容类型由枕头决定。
现在可以传递一个可调用文件,该文件在实例化 ChoiceField
.
使用的常规视图 MultipleObjectMixin
现在可以指定应用于 queryset
通过设置 ordering
或压倒一切 get_ordering()
.
新的 SingleObjectMixin.query_pk_and_slug
属性允许更改 get_object()
这样它就可以同时使用主键和slug执行查找。
这个 get_form()
方法不需要 form_class
再提供。如果不提供 form_class
默认为 get_form_class()
.
占位符 ModelFormMixin.success_url
现在支持python str.format()
语法。遗产 %(<foo>)s
语法仍受支持,但将在Django 1.10中删除。
FORMAT_MODULE_PATH
现在可以是表示模块路径的字符串列表。这允许从不同的可重用应用程序导入多个格式模块。它还允许覆盖主Django项目中的那些自定义格式。
这个 django.utils.log.AdminEmailHandler
类现在有一个 send_mail()
方法使其更适合子类。
数据库连接现在总是在从命令行调用的管理命令完成其工作后关闭。
现在还发现了来自其他包格式(如eggs)的命令。
新的 dumpdata --output
选项允许指定将序列化数据写入的文件。
新的 makemessages --exclude
和 compilemessages --exclude
选项允许从处理中排除特定区域设置。
compilemessages
现在有一个 --use-fuzzy
或 -f
选项,其中包括到编译文件的模糊翻译。
这个 loaddata --ignorenonexistent
选项现在忽略不再存在的模型的数据。
runserver
现在使用守护进程线程来更快地重新加载。
inspectdb
现在输出 Meta.unique_together
. 它还能够反省 AutoField
用于mysql和postgresql数据库。
使用选项调用管理命令时使用 call_command()
,选项名可以匹配命令行选项名(不带初始破折号)或最终选项目标变量名,但在这两种情况下,命令接收的结果选项现在总是 dest
在命令选项定义中指定的名称(只要命令使用 argparse
模块)。
这个 dbshell
命令现在支持MySQL的可选SSL证书颁发机构设置 (--ssl-ca
)
新的 makemigrations --name
允许为迁移指定自定义名称而不是生成的名称。
这个 loaddata
命令现在可防止重复加载夹具。如果 FIXTURE_DIRS
包含重复项或默认设备目录路径 (app_name/fixtures
)引发异常。
新的 makemigrations --exit
如果没有创建迁移,则选项允许退出并返回错误代码。
新的 showmigrations
命令允许列出项目中的所有迁移及其依赖项。
这个 CommonMiddleware.response_redirect_class
属性允许您自定义中间件发出的重定向。
调试消息将记录到 django.request
当中间件引发 MiddlewareNotUsed
例外 DEBUG
模式。
这个 RunSQL
操作现在可以处理传递给SQL语句的参数。
现在有可能发生迁移(很可能 data migrations )适用于没有型号的应用。
迁移现在可以 serialize model managers 作为模型状态的一部分。
A generic mechanism to handle the deprecation of model fields 加入。
这个 RunPython.noop()
和 RunSQL.noop
添加了类方法/属性以便于 RunPython
和 RunSQL
操作可逆。
迁移操作 RunPython
和 RunSQL
现在调用 allow_migrate()
数据库路由器的方法。路由器可以使用新引入的 app_label
和 hints
做出路由决定的参数。要利用此功能,您需要将路由器更新为新的 allow_migrate
签名,请参见 deprecation section 了解更多详细信息。
Django现在在 connections.queries
,以防止在调试模式下长时间运行的进程中使用过多的内存。
现在有一个模型 Meta
用于定义 default related name
对于模型的所有关系字段。
不同版本的django中的pickle模型和查询集没有得到官方支持(可能有效,但没有保证)。指定当前django版本的额外变量现在添加到模型和查询集的pickled状态,django引发 RuntimeWarning
当这些对象以不同于被腌制对象的版本被取出时。
补充 Model.from_db()
每当使用ORM加载对象时,Django都使用它。该方法允许自定义模型加载行为。
extra(select={{...}})
现在允许您转义文字 %s
序列使用 %%s
.
Custom Lookups 现在可以使用decorator模式注册。
新的 Transform.bilateral
属性允许创建双边转换。这些转换同时应用于 lhs
和 rhs
在查找表达式中使用时,为更复杂的查找提供机会。
当模式查找(例如 contains
, startswith
等)与 F()
表达为右手边。在这些情况下,转义是由数据库执行的,这可能导致一些涉及嵌套的复杂查询 REPLACE
函数调用。
现在可以使用 Model.refresh_from_db()
.
现在可以使用 Model.get_deferred_fields()
.
模型场 default
当主键字段设置为时,现在使用的是 None
.
例外 (receiver, exception)
元组返回者 Signal.send_robust()
现在把它们的回溯作为 __traceback__
属性。
这个 environ
已将包含来自请求的wsgi环境结构的参数添加到 request_started
信号。
现在可以导入 setting_changed()
信号来自 django.core.signals
避免装载 django.test
在非测试情况下。姜戈自己不再这样做了。
register
现在可以用作函数。
urlize
现在只支持包含顶级域后字符的域链接(例如 djangoproject.com/
和 djangoproject.com/download/
)
urlize
不将域结尾的感叹号或其查询字符串视为URL的一部分(例如 'djangoproject.com!
是 djangoproject.com
)
增加了一个 locmem.Loader
从Python字典加载django模板的类。
这个 now
标记现在可以用常规语法将其输出存储在上下文变量中: {{% now 'j n Y' as varname %}}
.
WSGIRequest
现在尊重从 //
.
这个 HttpRequest.build_absolute_uri()
方法现在处理以 //
正确地。
如果 DEBUG
是 True
一个请求引发一个 SuspiciousOperation
,将使用详细的错误页呈现响应。
这个 query_string
的参数 QueryDict
现在是可选的,默认为 None
一片空白 QueryDict
现在可以用实例化 QueryDict()
而不是 QueryDict(None)
或 QueryDict('')
.
这个 GET
和 POST
的属性 HttpRequest
对象现在 QueryDict
而不是字典, FILES
属性现在是 MultiValueDict
. 这使这个类与文档和 WSGIRequest
.
这个 HttpResponse.charset
已添加属性。
WSGIRequestHandler
现在遵循RFC将URI转换为IRI,使用 uri_to_iri()
.
这个 HttpRequest.get_full_path()
方法现在可以正确地从统一资源标识符(URI)的路径部分转义不安全的字符。
HttpResponse
现在实现了一些额外的方法,比如 getvalue()
这样实例就可以用作流对象。
新的 HttpResponse.setdefault()
方法允许设置头,除非已经设置了头。
你可以用新的 FileResponse
传输文件。
这个 condition()
条件视图处理的decorator现在支持 If-unmodified-since
标题。
这个 RequestFactory.trace()
和 Client.trace()
方法已实现,允许您创建 TRACE
测试中的请求。
这个 count
参数已添加到 assertTemplateUsed()
. 这允许您断言模板已呈现特定次数。
新的 assertJSONNotEqual()
断言允许您测试两个JSON片段不相等。
向添加了选项 test
保留测试数据库的命令 (--keepdb
)以相反的顺序运行测试用例 (--reverse
)并为失败的测试启用SQL日志记录 (--debug-sql
)
增加了 resolver_match
用于测试客户端响应的属性。
添加了几个允许为Oracle定制测试表空间参数的设置: DATAFILE
, DATAFILE_TMP
, DATAFILE_MAXSIZE
和 DATAFILE_TMP_MAXSIZE
.
这个 override_settings()
修饰符现在可以影响主路由器 DATABASE_ROUTERS
.
添加了对文件类对象文件上载的测试客户端支持。
当使用python 3.4+和sqlite 3.7.13+测试sqlite内存数据库时,现在使用共享缓存。这允许在线程之间共享数据库。
URLValidator
现在支持IPv6地址、Unicode域和包含身份验证数据的URL。
警告
除了本节概述的更改外,请务必查看 deprecation plan 对于任何已删除的功能。如果您没有在取消预测时间线内更新给定功能的代码,则删除该功能可能会显示为向后不兼容的更改。
备注
为了更容易地允许在内存中使用模型,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中取消了对反向一对一关系分配的类似检查。
将未保存的对象分配给 ForeignKey
, GenericForeignKey
和 OneToOneField
现在提出一个 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: ...
,因为变量解析现在基于 argparse
它不会隐式接受位置参数。只需设置 args
类变量。但是,如果您不必与旧的django版本保持兼容性,最好实现新的 add_arguments()
方法如中所述 如何创建自定义 django-admin 命令 .
向 test
通过测试运行员的管理命令已更改。以前,您可以提供 option_list
测试运行器上的类变量以添加更多参数(à la optparse
).现在要实现相同的行为,您必须创建一个 add_arguments(cls, parser)
测试运行器上的类方法和调用 parser.add_argument
添加任何自定义参数,因为解析器现在是 argparse.ArgumentParser
举个例子。
超过数据库支持的列名长度的字段名可能会产生问题。例如,使用MySQL,在尝试创建列时会得到一个异常,而使用PostgreSQL,列名称会被数据库截断(您可能会在PostgreSQL日志中看到警告)。
在实际创建数据库表之前,已经引入了一个模型检查来更好地提醒用户注意这个场景。
如果您有一个现有的模型,在这个模型中,这个检查似乎是一个误报,例如在已经被截断名称的PostgreSQL上,只需使用 db_column
指定正在使用的名称。
该检查还适用于隐式 ManyToManyField.through
模型。如果在那里遇到问题,请使用 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
包括在内。
PostgreSQL 8.4的上游支持期已于2014年7月结束。因此,Django1.8将9.0设置为它正式支持的最小PostgreSQL版本。
这还包括放弃对Postgis1.3和1.4的支持,因为在8.4之后的PostgreSQL版本上不支持这些版本。
Django现在还需要使用psycopg2 2.4.5或更高版本(如果您想使用,请使用2.5+ django.contrib.postgres
)
2012年1月MySQL5.0的上游支持期结束,2013年12月MySQL5.1的上游支持期结束。因此,django 1.8将5.5设置为它正式支持的最低mysql版本。
Oracle 9.2的上游支持期已于2010年7月结束,Oracle 10.1的支持期已于2012年1月结束,Oracle 10.2的支持期已于2013年7月结束。因此,Django1.8将11.1设置为它正式支持的最低Oracle版本。
Django的早期版本将connect和resource角色授予了Oracle上的测试用户。这些角色已被弃用,因此Django1.8使用特定的底层特权。这将更改主用户运行测试所需的特权(除非项目配置为避免创建测试用户)。现在所需的确切权限在 Oracle notes .
AbstractUser.last_login
允许空值¶这个 AbstractUser.last_login
字段现在允许空值。以前,它默认为创建用户的时间,如果用户从未登录,则会产生误导。如果您使用的是默认用户 (django.contrib.auth.models.User
,运行中包含的数据库迁移 contrib.auth
.
如果使用的自定义用户模型继承自 AbstractUser
,你需要运行 makemigrations
并为包含该模型的应用程序生成迁移。另外,如果想设置 last_login
到 NULL
对于尚未登录的用户,可以运行此查询::
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的支持已被取消。
已放弃对小于2.4的空间陨石的支持。
对特定于GIS的查找进行了重构,以使用 django.db.models.Lookup
应用程序编程接口。
默认值 str
代表 GEOSGeometry
对象已从wkt更改为ewkt格式(包括srid)。因为这个表示在序列化框架中使用,这意味着 dumpdata
现在输出将包含几何体对象的srid值。
TemplateResponse
与…一致 render
¶这个 TemplateResponse
构造函数被设计为 render()
功能。但是,它有一点不相容性,因为 TemplateResponse
,传入的上下文字典中的上下文数据可以由上下文处理器返回的上下文数据隐藏,而对于 render
相反。这是一个错误,而且 render
更合适,因为它允许在视图中本地重写全局定义的上下文处理器。如果您依赖的是 TemplateResponse
可以使用上下文处理器重写,您需要更改代码。
setUpClass
/ tearDownClass
在测试用例中¶装饰家 override_settings()
和 modify_settings()
现在,当用作类修饰符时,在类级别执行操作。因此,当 setUpClass()
或 tearDownClass()
, the super
应始终调用实现。
django.contrib.formtools
¶Formtools Contrib应用程序已移动到单独的包中,相关文档页已更新或删除。
有新的套餐 on GitHub 在PyPI上。
Django以前关闭了 TestCase
. 这已经不是问题了,因为德扬戈现在把整个 TestCase
在事务中。如果您的一些测试依赖于旧的行为,您应该让它们继承自 TransactionTestCase
相反。
django.template
命名空间¶如果您一直依赖于 django.template
模块,您可能需要从 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'>
要访问源模型,您可以使用类似这样的模式来编写代码,这些代码将与Django1.8和旧版本同时使用:
for relation in opts.get_all_related_objects():
to_model = getattr(relation, "related_model", relation.model)
还要注意 get_all_related_objects()
在1.8中已弃用。
记录对数据库后端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_types
, data_types_suffix
和 data_type_check_constraints
属性已从 DatabaseCreation
类到 DatabaseWrapper
.
这个 SQLCompiler.as_sql()
方法现在采用 subquery
参数 (#24164 )
这个 BaseDatabaseOperations.date_interval_sql()
方法现在只接受 timedelta
参数。
django.contrib.admin
¶AdminSite
不再需要 app_name
论点及其意义 app_name
属性已被删除。应用程序名称总是 admin
(与您仍然可以使用自定义的实例名称不同 AdminSite(name="...")
.
这个 ModelAdmin.get_object()
方法(private api)现在接受名为 from_field
为了指定哪个字段应与提供的 object_id
.
这个 ModelAdmin.response_delete()
方法现在接受名为 obj_id
它是用于在删除前检索对象的序列化标识符。
django.template.defaultfilters
¶为了在用python代码调用HTML时使输出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添加尾随斜杠。
这个 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将继续提供 pk
参数在 params
为了向后兼容。
UserCreationForm.error_messages['duplicate_username']
不再使用。如果要自定义该错误消息, override it on the form 使用 'unique'
键入 Meta.error_messages['username']
或者,如果有自定义表单域用于 'username'
,使用 'unique'
其关键 error_messages
参数。
街区 usertools
在 base.html
模板 django.contrib.admin
现在需要 has_permission
要设置的上下文变量。如果您有任何使用此模板的自定义管理视图,请更新它们以通过 AdminSite.has_permission()
作为这个新变量的值或简单地包括 AdminSite.each_context(request)
在上下文中。
对 ClearableFileInput
小部件允许更多的定制。无证件者 url_markup_template
属性被删除,以支持 template_with_initial
.
为了与其他主要供应商保持一致,请 en_GB
区域设置现在将星期一作为一周的第一天。
秒已从任何包含它们的区域中删除 TIME_FORMAT
, DATETIME_FORMAT
或 SHORT_DATETIME_FORMAT
.
Oracle测试表空间的默认最大大小已从300米(或200米,在1.7.2之前)增加到500米。
reverse()
和 reverse_lazy()
现在返回unicode字符串而不是bytestrings。
这个 CacheClass
填充程序已从所有缓存后端删除。这些别名是为了与Django1.3向后兼容而提供的。如果您仍在使用它们,请更新您的项目以使用在 BACKEND
钥匙 CACHES
设置。
默认情况下, call_command()
现在总是跳过检查框架(除非您通过它 skip_checks=False
)
When iterating over lines, File
now uses
universal newlines. The following are recognized as ending a
line: the Unix end-of-line convention '\n'
, the Windows convention
'\r\n'
, and the old Macintosh convention '\r'
.
memcached缓存后端 MemcachedCache
和 PyLibMCCache
将删除一个密钥,如果 set()
失败。这是确保 cache_db
会话存储总是获取最新的会话数据。
专用API override_template_loaders
和 override_with_test_loader
在里面 django.test.utils
被移除。重写 TEMPLATES
具有 override_settings
相反。
当 DEBUG
是 True
.
HttpRequest
现在简化了 repr
(例如) <WSGIRequest: GET '/somepath/'>
)这不会改变 SafeExceptionReporterFilter
类。
使用的基于类的视图 ModelFormMixin
将提高 ImproperlyConfigured
例外情况是 fields
和 form_class
指定了属性。以前, 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
而不是 LANGUAGE_CODE
当翻译被暂时停用时。
当特定文本的翻译不存在时,回退现在从 LANGUAGE_CODE
语言(而不是未翻译的 msgid
消息)。
这个 name
领域 django.contrib.contenttypes.models.ContentType
已被迁移删除并替换为属性。这意味着不可能查询或筛选 ContentType
在这个领域里。
如果升级到django 1.8并跳过django 1.7,请小心。如果你运行 manage.py migrate --fake
, this migration will be skipped and you'll see a RuntimeError: Error creating new content types.
例外是因为 name
不会从数据库中删除列。使用 manage.py migrate --fake-initial
只伪造初始迁移。
新的 migrate --fake-initial
选项允许伪造初始迁移。在1.7中,如果在初始迁移中创建的所有表都已存在,则初始迁移始终是自动伪造的。
一个应用程序 没有 带有 ForeignKey
应用程序 with 迁移现在可能会在迁移数据库或运行测试时导致外键约束错误。在Django1.7中,这可能会无声地失败并导致缺少约束。要解决此错误,请将迁移添加到不带迁移的应用程序。
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()
django.conf.urls.patterns()
¶在姜戈的旧时代,人们鼓励在 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字符串魔术”:错误地键入视图名称时的错误不那么模糊,IDE可以帮助自动完成视图名称等。
所以这些天,上述的使用 prefix
arg更可能被写(并且写得更好)为:
from myapp import views
urlpatterns = patterns(
"",
url("^$", views.myview),
url("^other/$", views.otherview),
)
因此, patterns()
在教新用户时,没有什么意义,而且是一种负担(回答新手的问题“为什么我需要这个空字符串作为第一个参数 patterns()
? ").出于这些原因,我们反对它。更新您的代码就像确保 urlpatterns
是一份 django.conf.urls.url()
实例.例如::
from django.conf.urls import url
from myapp import views
urlpatterns = [
url("^$", views.myview),
url("^other/$", views.otherview),
]
view
至 django.conf.urls.url()
¶与上一项相关,将视图作为字符串引用到 url()
函数已弃用。如前一节所述,传递可调用视图。
django.core.context_processors
¶内置模板上下文处理器已移动到 django.template.context_processors
.
django.test.SimpleTestCase.urls
¶属性 SimpleTestCase.urls
对于在测试中指定urlconf配置,已弃用,将在django 1.10中删除。使用 @override_settings(ROOT_URLCONF=...)
相反。
prefix
argument to i18n_patterns()
¶与上一项相关, prefix
参数为 django.conf.urls.i18n.i18n_patterns()
已被废弃。只需传递列表 django.conf.urls.url()
相反,实例。
for
模板标签¶在中使用不正确的未解包值计数 for
在django 1.10中,标记将引发异常而不是静默失败。
reverse()
和 url
¶通过python路径反转URL是一个代价高昂的操作,因为它会导致反向路径被导入。此行为还导致 security issue . 使用 named URL patterns 换成倒车。
如果您正在使用 django.contrib.sitemaps
,添加 name
论据 url
参考文献 django.contrib.sitemaps.views.sitemap()
::
from django.contrib.sitemaps.views import sitemap
url(
r"^sitemap\.xml$",
sitemap,
{"sitemaps": sitemaps},
name="django.contrib.sitemaps.views.sitemap",
)
为了确保在Django1.10中删除按python路径反转时的兼容性。
同样,对于地理信息系统站点地图,添加 name='django.contrib.gis.sitemaps.views.kml'
或 name='django.contrib.gis.sitemaps.views.kmz'
.
如果您使用的是 LOGIN_URL
或 LOGIN_REDIRECT_URL
设置,使用 url()
相反。
这个 django.db.models.sql.aggregates
和 django.contrib.gis.db.models.sql.aggregates
模块(都是私有API)已弃用为 django.db.models.aggregates
和 django.contrib.gis.db.models.aggregates
现在还负责生成SQL。旧模块将在Django 1.10中移除。
如果您使用的是旧模块,请参见 Query Expressions 有关使用新的稳定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
解析传递给命令的命令行参数。这还意味着向命令添加自定义参数的方式已经改变:而不是扩展 option_list
类列表,现在应该重写 add_arguments()
方法并通过添加参数 argparse.add_argument()
. 见 this example 了解更多详细信息。
django.core.management.NoArgsCommand
¶类 NoArgsCommand
现已弃用,将在Django 1.10中删除。使用 BaseCommand
相反,默认情况下不接受参数。
这个 --list
选择权 migrate
管理命令已弃用,将在Django 1.10中删除。使用 showmigrations
相反。
cache_choices
option of ModelChoiceField
and ModelMultipleChoiceField
¶ModelChoiceField
和 ModelMultipleChoiceField
选择了一个未经记录、未经测试的选项 cache_choices
. 在相同的多个呈现之间缓存的查询集 Form
对象。此选项将加速折旧,并将在Django 1.9中删除。
django.template.resolve_variable()
¶函数已经非正式地标记为“deprecated”一段时间了。替换 resolve_variable(path, context)
具有 django.template.Variable(path).resolve(context)
.
django.contrib.webdesign
¶它提供了 lorem
现在包含在内置标记中的模板标记。简单去除 'django.contrib.webdesign'
从 INSTALLED_APPS
和 {{% load webdesign %}}
从你的模板。
error_message
argument to django.forms.RegexField
¶它为1.0之前的代码提供了向后兼容性,但它的功能是多余的。使用 Field.error_messages['invalid']
相反。
unordered_list
句法¶较旧的(1.0之前的版本),更严格和详细的输入格式 unordered_list
模板筛选器已弃用::
["States", [["Kansas", [["Lawrence", []], ["Topeka", []]]], ["Illinois", []]]]
使用新的语法,这变为:
["States", ["Kansas", ["Lawrence", "Topeka"], "Illinois"]]
django.forms.Field._has_changed()
¶将此方法重命名为 has_changed()
删除前导下划线。老名字在姜戈1.10之前仍然有效。
is_admin_site
argument to django.contrib.auth.views.password_reset()
¶这是一个不再需要的传统选择。
SubfieldBase
¶django.db.models.fields.subclassing.SubfieldBase
已弃用,将在Django 1.10中删除。历史上,它用于处理从数据库加载时需要类型转换的字段,但在 .values()
调用或聚合。它已被替换为 from_db_value()
.
新的方法不称为 to_python()
分配方法与 SubfieldBase
. 如果您需要这种行为,请重新实现 Creator
类 from Django's source code 在你的项目中。
django.utils.checksums
¶这个 django.utils.checksums
模块已弃用,将在Django 1.10中删除。它提供的功能(使用Luhn算法验证校验和)没有文档记录,也没有在Django中使用。该模块已移动到 django-localflavor 程序包(1.1+版)。
InlineAdminForm.original_content_type_id
¶这个 original_content_type_id
属性对 InlineAdminForm
已弃用,将在Django 1.10中删除。历史上,它被用来构建“现场查看”的URL。现在可以使用 absolute_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
模板响应中的类¶几种方法 SimpleTemplateResponse
和 TemplateResponse
认可的 django.template.Context
和 django.template.Template
对象作为参数。他们现在应该得到 dict
和后端依赖模板对象。
这也适用于返回类型,如果您已经对模板响应类进行了子类化。
检查 template response API documentation 有关详细信息。
dictionary
和 context_instance
呈现函数的参数¶以下功能将不再接受 dictionary
和 context_instance
Django 1.10中的参数:
django.shortcuts.render()
django.shortcuts.render_to_response()
django.template.loader.render_to_string()
使用 context
改为参数。什么时候? dictionary
作为位置参数传递,这是最常见的习惯用法,不需要更改。
如果你通过 Context
在里面 context_instance
通过一个 dict
在 context
改为参数。如果你通过 RequestContext
,分别在 request
参数。
dirs
模板查找函数的参数¶以下函数将不再接受 dirs
要重写的参数 TEMPLATE_DIRS
在Django 1.10:
django.shortcuts.render_to_response()
该参数在不同的模板加载器中工作不一致,也不适用于包含的模板。
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中移除。
max_length
自定义参数 Storage
班¶Storage
子类应添加 max_length=None
作为参数 get_available_name()
和/或 save()
如果它们重写任何一个方法。对不接受此参数的存储的支持将在Django 1.10中删除。
qn
replaced by compiler
¶在以前的django版本中,各种内部ORM方法(主要是 as_sql
方法)接受 qn
(对于“quote name”)参数,它引用了一个函数,该函数引用了发送到数据库的标识符。在Django 1.8中,该参数已重命名为 compiler
现在已经满了 SQLCompiler
实例。为了向后兼容,调用 SQLCompiler
实例执行相同的名称,引用 qn
函数用于。但是,这个向后兼容性填充程序立即被否决:您应该重命名 qn
论据 compiler
和调用 compiler.quote_name_unless_alias(...)
你以前调用的地方 qn(...)
.
RedirectView.permanent
¶的默认值 RedirectView.permanent
属性将从更改 True
到 False
在Django 1.9。
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
在那之前的某个时候选择加入。请阅读 upgrade considerations 第一。
django.contrib.sitemaps.FlatPageSitemap
¶django.contrib.sitemaps.FlatPageSitemap
已经搬到 django.contrib.flatpages.sitemaps.FlatPageSitemap
. 旧的导入位置已弃用,将在Django 1.9中删除。
ssi
模板标签¶这个 ssi
模板标记允许文件按绝对路径包含在模板中。在大多数部署情况下,这是有限的,并且 include
标签通常更有意义。此标记现在已弃用,将在Django 1.10中删除。
=
作为比较运算符 if
模板标签¶使用一个等号 {{% if %}}
平等性测试的模板标记未记录和未测试。它现在被弃用了,取而代之的是 ==
.
%(<foo>)s
syntax in ModelFormMixin.success_url
¶遗产 %(<foo>)s
语法在 ModelFormMixin.success_url
已弃用,将在Django 1.10中删除。
GeoQuerySet
聚合方法¶这个 collect()
, extent()
, extent3d()
, make_line()
和 unionagg()
不推荐使用聚合方法,应将其替换为基于函数的聚合等效方法 (Collect
, Extent
, Extent3D
, MakeLine
和 Union
)
allow_migrate
路由方法¶签名 allow_migrate()
数据库路由器的方法已从更改为 allow_migrate(db, model)
到 allow_migrate(db, app_label, model_name=None, **hints)
.
什么时候? model_name
设置,以前通过 model
位置参数现在可以在 hints
关键字下的词典 'model'
.
这些功能已达到其折旧周期的末尾,并在Django 1.8中删除。见 1.6中不推荐的功能 有关详细信息,包括如何删除这些功能的用法。
django.contrib.comments
被移除。
将删除以下事务管理API:
TransactionMiddleware
装饰师和上下文管理器 autocommit
, commit_on_success
和 commit_manually
,定义在 django.db.transaction
功能 commit_unless_managed
和 rollback_unless_managed
,也在中定义 django.db.transaction
这个 TRANSACTIONS_MANAGED
设置
这个 SEND_BROKEN_LINK_EMAILS
设置被删除。
django.middleware.doc.XViewMiddleware
被移除。
这个 Model._meta.module_name
别名已删除。
引入向后兼容垫片以重命名 get_query_set
删除了类似的查询集方法。这将影响以下类: BaseModelAdmin
, ChangeList
, BaseCommentNode
, GenericForeignKey
, Manager
, SingleRelatedObjectDescriptor
和 ReverseSingleRelatedObjectDescriptor
.
引入向后兼容垫片来重命名属性 ChangeList.root_query_set
和 ChangeList.query_set
被移除。
django.views.defaults.shortcut
和 django.conf.urls.shortcut
被移除。
对python图像库(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.CacheMiddleware
和 django.middleware.cache.UpdateCacheMiddleware
尽管在后一类中没有弃用警告。
硬编码的用法 按住Mac上的“Control”(控制)或“Command”(命令),选择多个。 重写或附加到用户提供的字符串 help_text
在表格中 ManyToMany
模型字段不再由Django在模型或窗体层执行。
这个 Model._meta.get_(add|change|delete)_permission
方法被删除。
会话密钥 django_language
不再读取以获得向后兼容性。
删除地理位置图 (django.contrib.gis.sitemaps.views.index
和 django.contrib.gis.sitemaps.views.sitemap
)
django.utils.html.fix_ampersands
, the fix_ampersands
模板过滤器,以及 django.utils.html.clean_html
被移除。
7月 22, 2024