2016年8月1日
欢迎来到Django 1.10!
这些发行说明涵盖了 new features 以及一些 backwards incompatible changes 从django 1.9或更旧版本升级时,您需要注意。我们已经 dropped some features 已经到了他们的折旧周期结束,我们已经 begun the deprecation process for some features .
见 如何将Django升级到更新版本 如果正在更新现有项目,则提供指南。
和Django1.9一样,Django1.10需要python 2.7、3.4或3.5。我们 强烈推荐 只有官方支持每个系列的最新版本。
django.contrib.postgres
现在包括一个 collection of database functions 允许使用全文搜索引擎。您可以搜索关系数据库中的多个字段,将搜索与其他查找结合起来,使用不同的语言配置和权重,并按相关性对结果进行排名。
它现在还包含了Trigram支持,使用 trigram_similar
查找和 TrigramSimilarity
和 TrigramDistance
表达。
A new style of middleware is introduced 中描述的旧式中间件缺乏严格的请求/响应分层的问题 DEP 0005 。你将需要 adapt old, custom middleware 并从 MIDDLEWARE_CLASSES
设置为新的 MIDDLEWARE
设置以利用改进的优势。
这个 User
模型在 django.contrib.auth
最初只接受用户名中的ASCII字母和数字。虽然这不是一个慎重的选择,但在使用Python3时,Unicode字符总是被接受的。
用户名验证器现在只在python 3上默认显式接受unicode字符。
自定义用户模型可以使用新的 ASCIIUsernameValidator
或 UnicodeUsernameValidator
.
django.contrib.admin
¶对于在子路径上运行的站点,默认 URL for the "View site" link
在每个管理页面的顶部,现在将指向 request.META['SCRIPT_NAME']
如果设置,而不是 /
.
添加或编辑对象后出现的成功消息现在包含指向对象更改窗体的链接。
所有内嵌的javascript都将被删除,以便您可以启用 Content-Security-Policy
HTTP头,如果您愿意的话。
新的 InlineModelAdmin.classes
属性允许在内联字段集上指定类。与A并入 collapse
类最初将折叠,它们的头将有一个小的“显示”链接。
如果用户没有添加权限,则 object-tools
现在将呈现模型变更集上的块(不需要添加按钮)。这使得在这种情况下添加自定义工具变得更容易。
这个 LogEntry
模型现在将更改消息存储在JSON结构中,这样就可以使用当前的活动语言动态地转换消息。一个新的 LogEntry.get_change_message()
方法现在是检索更改消息的首选方法。
中字段的选定对象 ModelAdmin.raw_id_fields
现在有一个指向对象更改窗体的链接。
添加了“无日期”和“有日期”选项 DateFieldListFilter
如果字段可以为空。
嵌入在管理中的jquery库从版本2.1.4升级到2.2.3。
django.contrib.auth
¶增加了对 Argon2 password hash . 但是,它不是默认的,因为它需要第三方库。
pbkdf2密码散列器的默认迭代计数增加了25%。这种向后兼容的更改不会影响子类化的用户 django.contrib.auth.hashers.PBKDF2PasswordHasher
更改默认值。
这个 django.contrib.auth.views.logout()
视图发送“无缓存”头,以防止Safari缓存重定向和阻止用户注销的问题。
添加了可选的 backend
参数 django.contrib.auth.login()
允许在没有凭据的情况下使用它。
新的 LOGOUT_REDIRECT_URL
设置控制的重定向 django.contrib.auth.views.logout()
视图,如果视图没有 next_page
参数。
新的 redirect_authenticated_user
的参数 django.contrib.auth.views.login()
视图允许重定向访问登录页面的已验证用户。
新的 AllowAllUsersModelBackend
和 AllowAllUsersRemoteUserBackend
忽略的值 User.is_active
,同时 ModelBackend
和 RemoteUserBackend
现在拒绝非活动用户。
django.contrib.gis
¶Distance lookups 现在接受表达式作为距离值参数。
新的 GEOSGeometry.unary_union
属性计算此几何图形的所有元素的联合。
增加了 GEOSGeometry.covers()
二元谓词。
增加了 GDALBand.statistics()
方法及 mean
和 std
属性。
增加了对 Difference
, Intersection
和 SymDifference
MySQL上的函数。
添加了对实例化空几何图形的支持。
增加了 LineString.closed
和 MultiLineString.closed
性质。
这个 GeoJSON serializer 现在输出对象的主键 properties
字典(如果未指定特定字段)。
能够在 GDALBand.data()
方法已添加。波段数据现在可以有效地用重复值更新。
添加了数据库函数 IsValid
和 MakeValid
以及 isvalid
查找,全部用于Postgis。这允许在数据库端过滤和修复无效的几何图形。
为所有用户添加了栅格支持 spatial lookups .
django.contrib.postgres
¶为了方便, HStoreField
现在将其键和值强制转换为字符串。
django.contrib.sessions
¶这个 clearsessions
管理命令现在删除基于文件的会话。
django.contrib.sites
¶这个 Site
模型现在支持 natural keys .
django.contrib.staticfiles
¶这个 static
模板标记现在使用 django.contrib.staticfiles
如果它在 INSTALLED_APPS
. 这对于现在可以一直使用的第三方应用程序特别有用 {{% load static %}}
而不是 {{% load staticfiles %}}
或 {{% load static from staticfiles %}}
)不用担心 staticfiles
已安装应用程序。
你可以 more easily customize 这个 collectstatic --ignore
自定义选项 AppConfig
.
基于文件的缓存后端现在使用最高的pickle协议。
默认值 CSRF_FAILURE_VIEW
, views.csrf.csrf_failure()
现在接受一个可选的 template_name
参数,默认为 '403_csrf.html'
,以控制用于呈现页面的模板。
防止 BREACH 攻击,CSRF保护机制现在改变了每个请求的形式令牌值(同时保持不变的秘密,可以用来验证不同的令牌)。
时间数据减法在所有后端都是统一的。
如果数据库支持,则可以设置后端 DatabaseFeatures.can_return_ids_from_bulk_insert=True
实施 DatabaseOperations.fetch_returned_insert_ids()
在使用创建的对象上设置主键的步骤 QuerySet.bulk_create()
.
将关键字参数添加到 as_sql()
各种表达方法 (Func
, When
, Case
和 OrderBy
)允许数据库后端自定义它们而不改变 self
,这在使用不同的数据库后端时是不安全的。见 arg_joiner
和 **extra_context
参数 Func.as_sql()
举个例子。
存储后端现在用新方法提供了一个时区感知的API get_accessed_time()
, get_created_time()
和 get_modified_time()
. 他们返回一个时区感知 datetime
如果 USE_TZ
是 True
天真的 datetime
在本地时区,否则。
新的 Storage.generate_filename()
方法使实现不使用 os.path
以前在中的调用 FileField
.
窗体与控件 Media
现在服务使用 django.contrib.staticfiles
如果安装。
这个 <input>
标签渲染 CharField
现在包括一个 minlength
属性(如果字段具有 min_length
.
所需表单域现在具有 required
HTML属性。设置新的 Form.use_required_attribute
属性到 False
禁用它。这个 required
属性不包括在表单集的表单中,因为添加和删除表单集时浏览器验证可能不正确。
这个 View
类现在可以从导入 django.views
.
这个 i18n_patterns()
helper函数现在可以在使用指定的根urlconf中使用 request.urlconf
.
通过设置新的 prefix_default_language
参数用于 i18n_patterns()
到 False
,您可以不使用URL前缀访问默认语言。
set_language()
现在返回ajax请求的204状态代码(无内容),如果没有 next
参数在 POST
或 GET
.
这个 JavaScriptCatalog
和 JSONCatalog
基于类的视图取代已弃用的 javascript_catalog()
和 json_catalog()
基于函数的视图。新视图几乎等同于旧视图,除了默认情况下新视图收集 djangojs
从所有已安装的应用程序转换域,而不是仅从 LOCALE_PATHS
.
call_command()
现在返回从 command.handle()
方法。
新的 check --fail-level
选项允许指定将导致命令以非零状态退出的消息级别。
新的 makemigrations --check
选项使命令在检测到没有迁移的模型更改时以非零状态退出。
makemigrations
现在显示它生成的迁移文件的路径。
这个 shell --interface
选项现在接受 python
强制使用“普通”python解释器。
新的 shell --command
选项允许您以django和exit的形式运行命令,而不是打开交互式shell。
向添加了警告 dumpdata
如果在没有具体父代的情况下指定了代理模型(这将导致没有输出)。
新的 BaseCommand.requires_migrations_checks
属性可以设置为 True
如果希望命令打印警告,例如 runserver
如果磁盘上的迁移集与数据库中的迁移不匹配,则为。
为了协助测试, call_command()
现在接受命令对象作为第一个参数。
这个 shell
命令支持在系统上使用 libedit
例如MACOS。
这个 inspectdb
命令允许您通过将表名指定为参数来选择应检查哪些表。
添加了对序列化的支持 enum.Enum
对象。
为添加了支持 non-atomic migrations 通过设置 atomic
属性上的 Migration
.
这个 migrate
和 makemigrations
命令现在 check for a consistent migration history . 如果他们发现应用迁移的一些未应用的依赖项, InconsistentMigrationHistory
提高了。
这个 pre_migrate()
和 post_migrate()
信号现在开始发送它们的移动 plan
和 apps
.
代理模型中的反向外键现在传播到它们的具体类。由 ForeignKey
指向代理模型现在可以作为代理模型类上的描述符访问,并且可以在查询集筛选中引用。
新的 Field.rel_db_type()
方法返回字段的数据库列数据类型,如 ForeignKey
和 OneToOneField
指向另一个领域。
补充 BigAutoField
就像一个 AutoField
但它保证符合 1
到 9223372036854775807
.
QuerySet.in_bulk()
可以在不带任何参数的情况下调用以返回查询集中的所有对象。
related_query_name
现在支持使用 '%(app_label)s'
和 '%(class)s'
串。
允许重写从抽象基类继承的模型字段。
这个 prefetch_related_objects()
函数现在是公共API。
QuerySet.bulk_create()
使用PostgreSQL时设置对象的主键。
增加了 Cast
数据库函数。
代理模型现在可以继承共享公共非抽象父类的多个代理模型。
补充 Extract
函数将日期时间组件提取为整数,如年和小时。
补充 Trunc
函数将日期或日期时间截断为重要组件。它们支持诸如每天销售或每小时销售之类的查询。
Model.__init__()
现在从其关键字参数设置虚拟字段的值。
新的 Meta.base_manager_name
和 Meta.default_manager_name
选项允许控制 _base_manager
和 _default_manager
,分别。
补充 request.user
到调试视图。
补充 HttpResponse
方法 readable()
和 seekable()
使实例成为类似流的对象并允许用 io.TextIOWrapper
.
增加了 HttpRequest.content_type
和 content_params
从中分析的属性 CONTENT_TYPE
标题。
解析器 request.COOKIES
简化以更好地匹配浏览器的行为。 request.COOKIES
现在可能包含无效的cookie,根据 RFC 6265 但是可以通过 document.cookie
.
这个 django.core.serializers.json.DjangoJSONEncoder
现在知道如何序列化惰性字符串,通常用于可翻译内容。
为了更好地捕捉错误, TestCase
现在在每个测试结束时检查可延迟的数据库约束。
测试和测试用例可以 marked with tags 有选择地与新的 test --tag
和 test --exclude-tag
选项。
现在您可以登录并使用与测试客户机的会话,即使 django.contrib.sessions
不在 INSTALLED_APPS
.
加入 django.setup()
允许在请求/响应周期之外(例如在管理命令和独立脚本中)进行URL解析 FORCE_SCRIPT_NAME
设置时计入。
URLValidator
现在,域名标签的长度限制为63个字符,域名的总长度限制为每个字符253个字符。 RFC 1034 .
int_list_validator()
现在接受一个可选的 allow_negative
布尔参数,默认为 False
,以允许负整数。
警告
除了本节概述的更改外,请务必查看 1.10中删除的功能 对于已达到折旧周期结束并因此被移除的功能。如果您没有在取消预测时间线内更新给定功能的代码,则删除该功能可能会显示为向后不兼容的更改。
地理信息系统 AreaField
使用一个未指定的基础数值类型,该类型实际上可以是任何数值python类型。 decimal.Decimal
从数据库中检索到的值现在转换为 float
使其更容易与GIS库使用的值结合。
为了启用时间减法,必须设置 supports_temporal_subtraction
数据库功能标志 True
并实施 DatabaseOperations.subtract_temporals()
方法。此方法应返回SQL和计算 lhs
和 rhs
数据类型中用于存储的参数 DurationField
.
_meta.get_fields()
为代理模型返回一致的反向字段¶在Django 1.10之前, get_fields()
方法在代理模型上调用时返回不同的反向字段,而不是其代理的具体类。在这两种情况下,通过返回指向具体类或其代理之一的完整字段集,解决了这种不一致性。
AbstractUser.username
max_length
增加到150¶迁徙 django.contrib.auth.models.User.username
包括在内。如果有自定义用户模型继承自 AbstractUser
,您需要为您的用户模型生成和应用数据库迁移。
我们考虑增加到254个字符,以便更容易地允许使用电子邮件地址(限制为254个字符)作为用户名,但由于MySQL的限制而拒绝了它。当使用 utf8mb4
编码(建议使用适当的Unicode支持),MySQL默认只能创建191个字符的唯一索引。因此,如果您需要更长的长度,请使用自定义用户模型。
如果要保留用户名的30个字符限制,请在创建用户或更改用户名时使用自定义表单:
from django.contrib.auth.forms import UserCreationForm
class MyUserCreationForm(UserCreationForm):
username = forms.CharField(
max_length=30,
help_text="Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.",
)
如果您希望在管理员中保留此限制,请设置 UserAdmin.add_form
使用此表单:
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import User
class UserAdmin(BaseUserAdmin):
add_form = MyUserCreationForm
admin.site.unregister(User)
admin.site.register(User, UserAdmin)
PostgreSQL 9.1的上游支持将于2016年9月结束。因此,Django1.10将PostgreSQL 9.2设置为其官方支持的最低版本。
runserver
输出通过日志记录¶请求和响应处理 runserver
命令发送到 django.server 记录器而不是to sys.stderr
. 如果您禁用Django的日志配置或用自己的日志覆盖它,那么如果您希望看到该输出,则需要添加适当的日志配置::
LOGGING = {
# ...
"formatters": {
"django.server": {
"()": "django.utils.log.ServerFormatter",
"format": "[%(server_time)s] %(message)s",
}
},
"handlers": {
"django.server": {
"level": "INFO",
"class": "logging.StreamHandler",
"formatter": "django.server",
},
},
"loggers": {
"django.server": {
"handlers": ["django.server"],
"level": "INFO",
"propagate": False,
}
},
}
auth.CustomUser
和 auth.ExtensionUser
删除了测试模型¶自从Django1.8中引入了contrib应用程序的迁移之后,这些自定义用户测试模型的表就不再被创建,使得它们在测试环境中不可用。
取消拾取模型时,应用程序注册表不再自动填充。这在Django 1.7.2中被添加,以尝试允许在Django之外(例如在RQ工作人员中)取消拾取模型,而无需调用 django.setup()
但它会造成死锁的可能性。为了在RQ的情况下调整代码,您可以 provide your own worker script 调用 django.setup()
.
在旧版本中,分配 None
到不可为空的 ForeignKey
或 OneToOneField
提高 ValueError('Cannot assign None: "model.field" does not allow null values.')
. 为了与其他没有类似检查的模型字段保持一致,将删除此检查。
PASSWORD_HASHERS
设置¶Django 0.90将密码存储为未加密MD5。django 0.91增加了对salted sha1的支持,用户登录时可以自动升级密码。Django1.4添加了pbkdf2作为默认密码散列器。
如果您有一个旧的django项目,使用MD5或sha1(甚至是salted)编码的密码,请注意,使用当今的硬件可以相当容易地破解这些密码。为了让django用户确认继续使用弱哈希,将从默认值中删除以下哈希值 PASSWORD_HASHERS
设置:
"django.contrib.auth.hashers.SHA1PasswordHasher"
"django.contrib.auth.hashers.MD5PasswordHasher"
"django.contrib.auth.hashers.UnsaltedSHA1PasswordHasher"
"django.contrib.auth.hashers.UnsaltedMD5PasswordHasher"
"django.contrib.auth.hashers.CryptPasswordHasher"
考虑使用 wrapped password hasher 以增强数据库中的哈希值。如果不可行,请添加 PASSWORD_HASHERS
设置到您的项目,并添加回您需要的任何散列值。
您可以检查您的数据库是否有如下任何已删除的哈希值:
from django.contrib.auth import get_user_model
User = get_user_model()
# Unsalted MD5/SHA1:
User.objects.filter(password__startswith="md5$$")
User.objects.filter(password__startswith="sha1$$")
# Salted MD5/SHA1:
User.objects.filter(password__startswith="md5$").exclude(password__startswith="md5$$")
User.objects.filter(password__startswith="sha1$").exclude(password__startswith="sha1$$")
# Crypt hasher:
User.objects.filter(password__startswith="crypt$$")
from django.db.models import CharField
from django.db.models.functions import Length
CharField.register_lookup(Length)
# Unsalted MD5 passwords might not have an 'md5$$' prefix:
User.objects.filter(password__length=32)
Field.get_prep_lookup()
和 Field.get_db_prep_lookup()
方法已删除¶如果有一个实现这些方法的自定义字段,请为其注册自定义查找。例如::
from django.db.models import Field
from django.db.models.lookups import Exact
class MyField(Field): ...
class MyFieldExact(Exact):
def get_prep_lookup(self):
# do_custom_stuff_for_myfield
...
MyField.register_lookup(MyFieldExact)
django.contrib.gis
¶空间岩<3.0,地质<3.3的支护被放弃。
这个 add_postgis_srs()
的向后兼容性别名 django.contrib.gis.utils.add_srs_entry()
被移除。
在Oracle/GIS上, Area
聚合函数现在返回 float
而不是 decimal.Decimal
. (它仍然包在一个平方米的度量中。)
默认值 GEOSGeometry
默认情况下,将修剪表示(WKT输出)。也就是说,而不是 POINT (23.0000000000000000 5.5000000000000000)
你会得到 POINT (23 5.5)
.
两个新设置有助于通过大请求缓解拒绝服务攻击:
DATA_UPLOAD_MAX_MEMORY_SIZE
限制请求正文的大小。文件上载不计入此限制。
DATA_UPLOAD_MAX_NUMBER_FIELDS
限制解析的get/post参数的数量。
接收异常大表单文章的应用程序可能需要调整这些设置。
这个 repr()
A的 QuerySet
被包裹在 <QuerySet >
在调试时将其从普通列表中消除歧义。
utils.version.get_version()
收益率 PEP 440 兼容的候选版本(例如“1.10rc1”而不是“1.10c1”)。
CSRF令牌值现在需要为64个字母数字的字符串;32个字母数字的值(默认由旧版本的Django设置)将自动替换为64个字符的字符串。其他值视为无效。这只会影响替换这些令牌的开发人员或用户。
这个 LOGOUT_URL
由于Django从1.0之前的版本开始就没有使用过,所以设置被删除。如果在项目中使用它,可以将其添加到项目的设置中。默认值为 '/accounts/logout/'
.
对象与A close()
方法,例如将文件和生成器传递给 HttpResponse
现在立即关闭,而不是在wsgi服务器调用时关闭 close()
关于回应。
多余的 transaction.atomic()
拜访 QuerySet.update_or_create()
被移除。这可能会影响由测试的查询计数 TransactionTestCase.assertNumQueries()
.
支持 skip_validation
在里面 BaseCommand.execute(**options)
被移除。使用 skip_checks
(在Django 1.7中添加)而不是。
loaddata
现在提出一个 CommandError
而不是在找不到指定的设备文件时显示警告。
而不是直接访问 LogEntry.change_message
属性,现在最好调用 LogEntry.get_change_message()
将以当前语言提供消息的方法。
默认错误视图现在升高 TemplateDoesNotExist
如果不存在 template_name
指定。
未使用的 choices
的关键字参数 Select
和 SelectMultiple
小部件 render()
方法已删除。这个 choices
论证 render_options()
方法也被删除,使 selected_choices
第一个论点。
违反可延迟数据库约束的测试现在在支持可延迟约束的数据库上运行时将出错。
内置管理命令现在使用键索引 options
,例如 options['verbosity']
,而不是 options.get()
不再执行任何类型的强制。如果您使用 Command.execute()
(它绕过设置默认值的参数分析器)而不是 call_command()
. 而不是调用 Command.execute()
,将命令对象作为第一个参数传递给 call_command()
.
ModelBackend
和 RemoteUserBackend
现在拒绝非活动用户。这意味着非活动用户无法登录,如果从 is_active=True
到 False
. 如果您需要以前的行为,请使用新的 AllowAllUsersModelBackend
或 AllowAllUsersRemoteUserBackend
在里面 AUTHENTICATION_BACKENDS
相反。
根据之前的更改,测试客户的 login()
方法不再总是拒绝不活动的用户,而是将此决定委托给身份验证后端。 force_login()
同时将决定委托给认证后端,因此如果使用默认后端,则需要使用活动用户。
django.views.i18n.set_language()
现在可以为Ajax请求返回204状态代码。
这个 base_field
属性 RangeField
现在是字段的类型,而不是字段的实例。如果您已经创建了 RangeField
,您应该更改 base_field
属性。
中间件类现在是在服务器启动时初始化的,而不是在第一个请求期间初始化的。
如果你重写 is_authenticated()
或 is_anonymous()
在自定义用户模型中,必须将它们转换为属性或属性,如中所述。 the deprecation note .
使用时 ModelAdmin.save_as=True
,此时“另存为新”按钮将重定向到新对象的更改视图,而不是模型的更改列表。如果需要以前的行为,请设置新的 ModelAdmin.save_as_continue
属性到 False
.
所需表单域现在具有 required
HTML属性。设置 Form.use_required_attribute
属性到 False
禁用它。您也可以添加 novalidate
属性到 <form>
如果不需要浏览器验证。禁用 required
自定义小部件的属性,重写 Widget.use_required_attribute()
方法。
WSGI处理程序不再从 HEAD
的请求或响应 status_code
100-199、204或304。大多数Web服务器已经实现了此行为。使用Django测试客户端检索的响应将继续应用这些“响应修复”。
Model.__init__()
现在收到 django.db.models.DEFERRED
作为延迟字段的值。
这个 Model._deferred
属性在使用时作为动态模型类删除 QuerySet.defer()
和 only()
被移除。
Storage.save()
不再取代 '\'
具有 '/'
. 此行为将移至 FileSystemStorage
因为这是特定于存储的实现细节。任何具有依赖此行为的自定义存储实现的Windows用户都需要在自定义存储中实现它。 save()
方法。
私人的 FileField
方法 get_directory_name()
和 get_filename()
不再调用(现在已弃用),这对于在自定义字段上重写这些方法的用户来说是向后不兼容的更改。为了适应这种代码,请重写 FileField.generate_filename()
或 Storage.generate_filename()
相反。可能可以使用 upload_to
也。
邮件的主题 AdminEmailHandler
不再以989个字符截断。如果你指望的是有限的长度,那么就自己截断主题。
私有表达式 django.db.models.expressions.Date
和 DateTime
被移除。新的 Trunc
表达式提供相同的功能。
这个 _base_manager
和 _default_manager
属性将从模型实例中删除。它们在模型类上保持可访问性。
访问模型实例上的已删除字段,例如 del obj.field
,重新加载字段的值,而不是提高 AttributeError
.
如果你是子类 AbstractBaseUser
超驰 clean()
,一定要调用 super()
. AbstractBaseUser.normalize_username()
在新的 AbstractBaseUser.clean()
方法。
私有API django.forms.models.model_to_dict()
返回的查询集而不是主键列表 ManyToManyField
S
如果 django.contrib.staticfiles
是安装的, static
模板标记使用 staticfiles
用于构造URL的存储,而不是简单地将值与 STATIC_ROOT
. 新的方法对URL进行编码,在某些情况下,例如在路径中包含一个片段,这可能是向后不兼容的。 {{% static 'img.svg#fragment' %}}
,因为 #
编码为 %23
. 要适应,请将片段移出模板标记: {{% static 'img.svg' %}}#fragment
.
什么时候 USE_L10N
是 True
,本地化现已应用于 date
和 time
未指定格式字符串时进行筛选。这个 DATE_FORMAT
和 TIME_FORMAT
使用活动区域设置中的说明符,而不是相同名称的设置。
不使用直接分配来分配相关对象:
>>> new_list = [obj1, obj2, obj3]
>>> e.related_set = new_list
使用 set()
Django 1.9中增加的方法:
>>> e.related_set.set([obj1, obj2, obj3])
这可以防止对赋值的混淆,从而导致隐式保存。
Storage
API¶旧的非时区感知方法 accessed_time()
, created_time()
和 modified_time()
为支持新的 get_*_time()
方法。
第三方存储后端应实现新方法,并将旧方法标记为已弃用。直到那时,新的 get_*_time()
基本方法 Storage
类转换 datetime
根据需要从旧方法中删除,并在执行此操作时发出弃用警告。
第三方存储后端可以保留旧方法,只要它们希望支持早期版本的Django。
django.contrib.gis
¶这个 get_srid()
和 set_srid()
方法 GEOSGeometry
被否决,赞成 srid
财产。
这个 get_x()
, set_x()
, get_y()
, set_y()
, get_z()
和 set_z()
方法 Point
被否决,赞成 x
, y
和 z
性质。
这个 get_coords()
和 set_coords()
方法 Point
被否决,赞成 tuple
财产。
这个 cascaded_union
性质 MultiPolygon
已弃用,取而代之的是 unary_union
财产。
这个 django.contrib.gis.utils.precision_wkt()
函数已弃用,取而代之的是 WKTWriter
.
CommaSeparatedIntegerField
模型场¶CommaSeparatedIntegerField
被否决,赞成 CharField
与 validate_comma_separated_integer_list()
验证器:
from django.core.validators import validate_comma_separated_integer_list
from django.db import models
class MyModel(models.Model):
numbers = models.CharField(..., validators=[validate_comma_separated_integer_list])
如果你使用的是Oracle, CharField
使用其他数据库字段类型 (NVARCHAR2
比 CommaSeparatedIntegerField
(VARCHAR2
)根据您的数据库设置,这可能意味着不同的编码,因此相同内容的长度(以字节为单位)也不同。如果存储的值超过了 NVARCHAR2
,您应该使用 TextField
(NCLOB
相反。在这种情况下,如果您有任何按字段分组的查询(例如,用聚合或使用 distinct()
)您需要更改它们(以推迟字段)。
__search
查询查找¶这个 search
lookup只支持MySQL,而且功能非常有限,因此已被弃用。将其替换为自定义查找::
from django.db import models
class Search(models.Lookup):
lookup_name = "search"
def as_mysql(self, compiler, connection):
lhs, lhs_params = self.process_lhs(compiler, connection)
rhs, rhs_params = self.process_rhs(compiler, connection)
params = lhs_params + rhs_params
return "MATCH (%s) AGAINST (%s IN BOOLEAN MODE)" % (lhs, rhs), params
models.CharField.register_lookup(Search)
models.TextField.register_lookup(Search)
User.is_authenticated()
和 User.is_anonymous()
作为方法¶这个 is_authenticated()
和 is_anonymous()
方法 AbstractBaseUser
和 AnonymousUser
类现在是属性。在django 2.0之前,它们仍然作为方法工作,但django中的所有用法现在都使用属性访问。
例如,如果使用 AuthenticationMiddleware
并想知道用户当前是否登录,您将使用:
if request.user.is_authenticated:
... # Do something for logged-in users.
else:
... # Do something for anonymous users.
而不是 request.user.is_authenticated()
.
如果您忘记调用方法,例如::
if request.user.is_authenticated:
return sensitive_information
如果在自定义用户模型中重写这些方法,则必须将它们更改为属性或属性。
Django使用 CallableBool
对象以允许这些属性同时作为属性和方法工作。因此,在折旧期结束之前,不能使用 is
操作员。也就是说,以下内容不起作用:
if request.user.is_authenticated is True:
...
django.utils.safestring
¶这个 mark_for_escaping()
函数及其使用的类: EscapeData
, EscapeBytes
, EscapeText
, EscapeString
和 EscapeUnicode
被贬低。
因此,“懒惰”的行为 escape
过滤器(它总是作为最后一个过滤器应用,不管它出现在过滤器链的什么位置)被弃用。过滤器将更改为立即应用 conditional_escape()
在Django 2。
这个 makemigrations --exit
选项已弃用,取而代之的是 makemigrations --check
选择权。
django.utils.functional.allow_lazy()
为支持新的 keep_lazy()
可以与更自然的修饰语法一起使用的函数。
这个 shell --plain
选项已弃用,取而代之的是 -i python
或 --interface python
.
从导入 django.core.urlresolvers
模块因其新位置而被弃用, django.urls
.
模板 Context.has_key()
方法已弃用,取而代之的是 in
.
私有属性 virtual_fields
属于 Model._meta
被否决,赞成 private_fields
.
private关键字参数 virtual_only
在里面 Field.contribute_to_class()
和 virtual
在里面 Model._meta.add_field()
被否决,赞成 private_only
和 private
,分别。
这个 javascript_catalog()
和 json_catalog()
视图被弃用,取而代之的是基于类的视图 JavaScriptCatalog
和 JSONCatalog
.
在多表继承中,隐式提升 OneToOneField
到A parent_link
被贬低。添加 parent_link=True
到这样的领域。
私有API Widget._format_value()
已公开并重命名为 format_value()
. 旧名称将经过一个折旧期。
私人的 FileField
方法 get_directory_name()
和 get_filename()
不赞成在 Storage.generate_filename()
)
使用的旧式中间件 settings.MIDDLEWARE_CLASSES
被贬低。 Adapt old, custom middleware 并使用新的 MIDDLEWARE
设置。
这些功能已达到其折旧周期的末尾,并在Django 1.10中删除。见 1.8中不推荐的功能 有关详细信息,包括如何删除这些功能的用法。
支持调用 SQLCompiler
直接作为调用其 quote_name_unless_alias
方法已删除。
这个 cycle
和 firstof
模板标记将从 future
模板标记库。
django.conf.urls.patterns()
被移除。
支持 prefix
参数 django.conf.urls.i18n.i18n_patterns()
被移除。
SimpleTestCase.urls
被移除。
在 for
模板标记引发异常,而不是静默失败。
能力 reverse()
使用点式python路径的URL将被删除。
能够使用点式python路径 LOGIN_URL
和 LOGIN_REDIRECT_URL
设置被删除。
支持 optparse
为自定义管理命令删除。
类 django.core.management.NoArgsCommand
被移除。
django.core.context_processors
模块被移除。
django.db.models.sql.aggregates
模块被移除。
django.contrib.gis.db.models.sql.aggregates
模块被移除。
以下方法和特性 django.db.sql.query.Query
被移除:
性能: aggregates
和 aggregate_select
方法: add_aggregate
, set_aggregate_mask
和 append_aggregate_mask
.
django.template.resolve_variable
被移除。
从中删除以下私有API django.db.models.options.Options
(Model._meta
):
get_field_by_name()
get_all_field_names()
get_fields_with_model()
get_concrete_fields_with_model()
get_m2m_with_model()
get_all_related_objects()
get_all_related_objects_with_model()
get_all_related_many_to_many_objects()
get_all_related_m2m_objects_with_model()
这个 error_message
的参数 django.forms.RegexField
被移除。
这个 unordered_list
过滤器不再支持旧样式列表。
支持字符串 view
论据 url()
被移除。
要重命名的向后兼容垫片 django.forms.Form._has_changed()
到 has_changed()
被移除。
这个 removetags
模板筛选器已删除。
这个 remove_tags()
和 strip_entities()
功能在 django.utils.html
被移除。
这个 is_admin_site
参数 django.contrib.auth.views.password_reset()
被移除。
django.db.models.field.subclassing.SubfieldBase
被移除。
django.utils.checksums
被移除。
这个 original_content_type_id
属性对 django.contrib.admin.helpers.InlineAdminForm
被移除。
向后兼容垫片允许 FormMixin.get_form()
在没有默认值的情况下定义 form_class
参数已删除。
以下设置已删除,您必须升级到 TEMPLATES
设置:
ALLOWED_INCLUDE_ROOTS
TEMPLATE_CONTEXT_PROCESSORS
TEMPLATE_DEBUG
TEMPLATE_DIRS
TEMPLATE_LOADERS
TEMPLATE_STRING_IF_INVALID
向后兼容别名 django.template.loader.BaseLoader
被移除。
Django模板对象返回者 get_template()
和 select_template()
不再接受 Context
在他们 render()
方法。
Template response APIs 强制使用 dict
和后端相关的模板对象,而不是 Context
和 Template
分别。
这个 current_app
删除以下函数和类的参数:
django.shortcuts.render()
django.template.Context()
django.template.RequestContext()
django.template.response.TemplateResponse()
这个 dictionary
和 context_instance
删除以下函数的参数:
django.shortcuts.render()
django.shortcuts.render_to_response()
django.template.loader.render_to_string()
这个 dirs
删除以下函数的参数:
django.template.loader.get_template()
django.template.loader.select_template()
django.shortcuts.render()
django.shortcuts.render_to_response()
无论是否启用会话验证 'django.contrib.auth.middleware.SessionAuthenticationMiddleware'
是在 MIDDLEWARE_CLASSES
. SessionAuthenticationMiddleware
不再有任何目的,可以从 MIDDLEWARE_CLASSES
. 它一直作为存根保存到Django2.0,作为对没有阅读此说明的用户的礼貌。
私有属性 django.db.models.Field.related
被移除。
这个 --list
选择权 migrate
删除管理命令。
这个 ssi
模板标记已删除。
支持 =
中的比较运算符 if
模板标记已删除。
向后兼容性垫片允许 Storage.get_available_name()
和 Storage.save()
在没有 max_length
参数被删除。
对遗产的支持 %(<foo>)s
语法在 ModelFormMixin.success_url
被移除。
GeoQuerySet
聚合方法 collect()
, extent()
, extent3d()
, make_line()
和 unionagg()
被移除。
指定的能力 ContentType.name
创建内容类型实例时将被删除。
支持的旧签名 allow_migrate
被移除。
支持的语法 {{% cycle %}}
使用逗号分隔的参数将被删除。
警告: Signer
当给定无效分隔符时发出 ValueError
.
7月 22, 2024