Django 1.10发行说明

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升级到更新版本 如果正在更新现有项目,则提供指南。

python兼容性

和Django1.9一样,Django1.10需要python 2.7、3.4或3.5。我们 强烈推荐 只有官方支持每个系列的最新版本。

Django 1.10的新功能

PostgreSQL全文搜索

django.contrib.postgres 现在包括一个 collection of database functions 允许使用全文搜索引擎。您可以搜索关系数据库中的多个字段,将搜索与其他查找结合起来,使用不同的语言配置和权重,并按相关性对结果进行排名。

它现在还包含了Trigram支持,使用 trigram_similar 查找和 TrigramSimilarityTrigramDistance 表达。

新型中间件

A new style of middleware is introduced 中描述的旧式中间件缺乏严格的请求/响应分层的问题 DEP 0005 。你将需要 adapt old, custom middleware 并从 MIDDLEWARE_CLASSES 设置为新的 MIDDLEWARE 设置以利用改进的优势。

Unicode用户名的官方支持

这个 User 模型在 django.contrib.auth 最初只接受用户名中的ASCII字母和数字。虽然这不是一个慎重的选择,但在使用Python3时,Unicode字符总是被接受的。

用户名验证器现在只在python 3上默认显式接受unicode字符。

自定义用户模型可以使用新的 ASCIIUsernameValidatorUnicodeUsernameValidator .

次要特征

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() 视图允许重定向访问登录页面的已验证用户。

  • 新的 AllowAllUsersModelBackendAllowAllUsersRemoteUserBackend 忽略的值 User.is_active ,同时 ModelBackendRemoteUserBackend 现在拒绝非活动用户。

django.contrib.gis

django.contrib.postgres

  • 为了方便, HStoreField 现在将其键和值强制转换为字符串。

django.contrib.sessions

  • 这个 clearsessions 管理命令现在删除基于文件的会话。

django.contrib.sites

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

  • 默认值 CSRF_FAILURE_VIEWviews.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() 各种表达方法 (FuncWhenCaseOrderBy )允许数据库后端自定义它们而不改变 self ,这在使用不同的数据库后端时是不安全的。见 arg_joiner**extra_context 参数 Func.as_sql() 举个例子。

文件存储

形式

  • 窗体与控件 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 参数在 POSTGET .

  • 这个 JavaScriptCatalogJSONCatalog 基于类的视图取代已弃用的 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 对象。

  • 增加了 elidable 论据 RunSQLRunPython 允许在挤压迁移时删除它们的操作。

  • 为添加了支持 non-atomic migrations 通过设置 atomic 属性上的 Migration .

  • 这个 migratemakemigrations 命令现在 check for a consistent migration history . 如果他们发现应用迁移的一些未应用的依赖项, InconsistentMigrationHistory 提高了。

  • 这个 pre_migrate()post_migrate() 信号现在开始发送它们的移动 planapps .

模型

  • 代理模型中的反向外键现在传播到它们的具体类。由 ForeignKey 指向代理模型现在可以作为代理模型类上的描述符访问,并且可以在查询集筛选中引用。

  • 新的 Field.rel_db_type() 方法返回字段的数据库列数据类型,如 ForeignKeyOneToOneField 指向另一个领域。

  • 这个 arity 类属性添加到 Func . 此属性可用于设置函数接受的参数数目。

  • 补充 BigAutoField 就像一个 AutoField 但它保证符合 19223372036854775807 .

  • 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_nameMeta.default_manager_name 选项允许控制 _base_manager_default_manager ,分别。

请求和响应

串行化

  • 这个 django.core.serializers.json.DjangoJSONEncoder 现在知道如何序列化惰性字符串,通常用于可翻译内容。

模板

  • 增加了 autoescape 选择权 DjangoTemplates 后端和 Engine 类。

  • 增加了 isis not 将运算符与 if 标签。

  • 允许 dictsort 按元素在指定索引处对列表进行排序。

  • 这个 debug() 上下文处理器包含对所有数据库别名的查询,而不仅仅是默认别名。

  • 添加了对字符串参数的相对路径支持 extendsinclude 模板标签。

测验

URLs

  • 加入 django.setup() 允许在请求/响应周期之外(例如在管理命令和独立脚本中)进行URL解析 FORCE_SCRIPT_NAME 设置时计入。

验证器

  • URLValidator 现在,域名标签的长度限制为63个字符,域名的总长度限制为每个字符253个字符。 RFC 1034 .

  • int_list_validator() 现在接受一个可选的 allow_negative 布尔参数,默认为 False ,以允许负整数。

1.10中的向后不兼容更改

警告

除了本节概述的更改外,请务必查看 1.10中删除的功能 对于已达到折旧周期结束并因此被移除的功能。如果您没有在取消预测时间线内更新给定功能的代码,则删除该功能可能会显示为向后不兼容的更改。

数据库后端API

  • 地理信息系统 AreaField 使用一个未指定的基础数值类型,该类型实际上可以是任何数值python类型。 decimal.Decimal 从数据库中检索到的值现在转换为 float 使其更容易与GIS库使用的值结合。

  • 为了启用时间减法,必须设置 supports_temporal_subtraction 数据库功能标志 True 并实施 DatabaseOperations.subtract_temporals() 方法。此方法应返回SQL和计算 lhsrhs 数据类型中用于存储的参数 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的支持

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.CustomUserauth.ExtensionUser 删除了测试模型

自从Django1.8中引入了contrib应用程序的迁移之后,这些自定义用户测试模型的表就不再被创建,使得它们在测试环境中不可用。

当在Django之外取消拾取模型时,应用程序注册表不再自动填充。

取消拾取模型时,应用程序注册表不再自动填充。这在Django 1.7.2中被添加,以尝试允许在Django之外(例如在RQ工作人员中)取消拾取模型,而无需调用 django.setup() 但它会造成死锁的可能性。为了在RQ的情况下调整代码,您可以 provide your own worker script 调用 django.setup() .

已删除非空外键字段的空分配检查

在旧版本中,分配 None 到不可为空的 ForeignKeyOneToOneField 提高 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) .

请求主体的最大大小和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 的关键字参数 SelectSelectMultiple 小部件 render() 方法已删除。这个 choices 论证 render_options() 方法也被删除,使 selected_choices 第一个论点。

  • 违反可延迟数据库约束的测试现在在支持可延迟约束的数据库上运行时将出错。

  • 内置管理命令现在使用键索引 options ,例如 options['verbosity'] ,而不是 options.get() 不再执行任何类型的强制。如果您使用 Command.execute() (它绕过设置默认值的参数分析器)而不是 call_command() . 而不是调用 Command.execute() ,将命令对象作为第一个参数传递给 call_command() .

  • ModelBackendRemoteUserBackend 现在拒绝非活动用户。这意味着非活动用户无法登录,如果从 is_active=TrueFalse . 如果您需要以前的行为,请使用新的 AllowAllUsersModelBackendAllowAllUsersRemoteUserBackend 在里面 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.DateDateTime 被移除。新的 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_L10NTrue ,本地化现已应用于 datetime 未指定格式字符串时进行筛选。这个 DATE_FORMATTIME_FORMAT 使用活动区域设置中的说明符,而不是相同名称的设置。

1.10中不推荐的功能

直接分配给反向外键或多对多关系

不使用直接分配来分配相关对象:

>>> 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 被否决,赞成 xyz 性质。

  • 这个 get_coords()set_coords() 方法 Point 被否决,赞成 tuple 财产。

  • 这个 cascaded_union 性质 MultiPolygon 已弃用,取而代之的是 unary_union 财产。

  • 这个 django.contrib.gis.utils.precision_wkt() 函数已弃用,取而代之的是 WKTWriter .

CommaSeparatedIntegerField 模型场

CommaSeparatedIntegerField 被否决,赞成 CharFieldvalidate_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 使用其他数据库字段类型 (NVARCHAR2CommaSeparatedIntegerField (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() 方法 AbstractBaseUserAnonymousUser 类现在是属性。在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() 函数及其使用的类: EscapeDataEscapeBytesEscapeTextEscapeStringEscapeUnicode 被贬低。

因此,“懒惰”的行为 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_onlyprivate ,分别。

  • 这个 javascript_catalog()json_catalog() 视图被弃用,取而代之的是基于类的视图 JavaScriptCatalogJSONCatalog .

  • 在多表继承中,隐式提升 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 设置。

1.10中删除的功能

这些功能已达到其折旧周期的末尾,并在Django 1.10中删除。见 1.8中不推荐的功能 有关详细信息,包括如何删除这些功能的用法。

  • 支持调用 SQLCompiler 直接作为调用其 quote_name_unless_alias 方法已删除。

  • 这个 cyclefirstof 模板标记将从 future 模板标记库。

  • django.conf.urls.patterns() 被移除。

  • 支持 prefix 参数 django.conf.urls.i18n.i18n_patterns() 被移除。

  • SimpleTestCase.urls 被移除。

  • for 模板标记引发异常,而不是静默失败。

  • 能力 reverse() 使用点式python路径的URL将被删除。

  • 能够使用点式python路径 LOGIN_URLLOGIN_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 被移除:

    • 性能: aggregatesaggregate_select

    • 方法: add_aggregateset_aggregate_maskappend_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 和后端相关的模板对象,而不是 ContextTemplate 分别。

  • 这个 current_app 删除以下函数和类的参数:

    • django.shortcuts.render()

    • django.template.Context()

    • django.template.RequestContext()

    • django.template.response.TemplateResponse()

  • 这个 dictionarycontext_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 .