2017年12月2日
欢迎来到Django 2.0!
这些发行说明涵盖了 new features 以及一些 backwards incompatible changes 从django 1.11或更早版本升级时,您需要注意。我们已经 dropped some features 已经到了他们的折旧周期结束,我们已经 begun the deprecation process for some features .
此版本开始Django使用 loose form of semantic versioning 但是没有任何主要的向后不兼容的变更,这可能是2.0版本的预期结果。升级的工作量应该与以前的功能版本相当。
见 如何将Django升级到更新版本 如果正在更新现有项目,则提供指南。
Django2.0支持python 3.4、3.5、3.6和3.7。我们 强烈推荐 只有官方支持每个系列的最新版本。
django 1.11.x系列是最后一个支持python 2.7的系列。
Django2.0将是支持Python3.4的最后一个发行版系列。如果您计划在Django 2.0(2019年4月)的生命周期结束后部署python 3.4,请改为使用Django 1.11 LTS(支持到2020年4月)。但是请注意,Python3.4的生命周期结束于2019年3月。
在Django2.0发布之后,我们建议第三方应用程序作者放弃对1.11之前所有版本的Django的支持。那时,您应该能够使用 python -Wd
这样就出现了反预测警告。在修复了拒绝警告之后,您的应用程序应该与Django 2.0兼容。
新的 django.urls.path()
函数允许使用更简单、更易读的URL路由语法。例如,此示例来自以前的Django版本:
url(r"^articles/(?P<year>[0-9]{4})/$", views.year_archive),
可以写成:
path("articles/<int:year>/", views.year_archive),
新语法支持URL参数的类型强制。在示例中,视图将接收 year
关键字参数是整数而不是字符串。另外,在重写的示例中,将匹配的URL受到的约束也稍微小一些。例如,10000年现在将匹配,因为年份整数不受限制为正好四位数,只要它们在正则表达式中。
这个 django.conf.urls.url()
以前版本的函数现在可用为 django.urls.re_path()
. 旧位置保持向后兼容性,而不会立即遭到拒绝。老年人 django.conf.urls.include()
函数现在可从导入 django.urls
所以你可以使用 from django.urls import include, path, re_path
在你的家庭里。
这个 URL调度器 文档将被重写,以适应新的语法并提供更多详细信息。
contrib.admin
¶管理员现在可以响应并支持所有主要的移动设备。较旧的浏览器可能会经历不同程度的优雅降级。
新的 Window
表达式允许添加 OVER
子句到查询集。你可以使用 window functions 和 aggregate functions 在表达式中。
django.contrib.admin
¶新的 ModelAdmin.autocomplete_fields
属性和 ModelAdmin.get_autocomplete_fields()
方法允许使用 Select2 搜索小部件以查找 ForeignKey
和 ManyToManyField
。
django.contrib.auth
¶pbkdf2密码散列器的默认迭代计数从36000增加到100000。
django.contrib.gis
¶添加了对 AsGeoJSON
函数, GeoHash
函数, IsValid
函数, isvalid
查找,以及 distance lookups .
增加了 Azimuth
和 LineLocatePoint
在Postgis和Spatialite上支持的函数。
任何 GEOSGeometry
从geojson导入的现在已经设置了srid。
增加了 OSMWidget.default_zoom
属性自定义地图的默认缩放级别。
允许将特定于驱动程序的创建选项传递给 GDALRaster
对象使用 papsz_options
.
允许创建 GDALRaster
gdal内部虚拟文件系统中的对象。Raster现在可以 created from and converted to binary data 在记忆中。
新的 GDALBand.color_interp()
方法返回带区的颜色解释。
django.contrib.postgres
¶新的 distinct
的参数 ArrayAgg
确定连接的值是否不同。
新的 RandomUUID
数据库函数返回版本4 UUID。它需要使用PostgreSQL pgcrypto
可使用新的 CryptoExtension
迁移操作。
django.contrib.postgres.indexes.GinIndex
现在支持 fastupdate
和 gin_pending_list_limit
参数。
新的 GistIndex
类允许创建 GiST
数据库中的索引。新的 BtreeGistExtension
迁移操作安装 btree_gist
扩展以添加对非内置运算符类的支持。
inspectdb
现在可以反省 JSONField
和各种 RangeField
的S (django.contrib.postgres
必须在 INSTALLED_APPS
)
django.contrib.sitemaps
¶增加了 protocol
关键字参数 GenericSitemap
建造师。
cache.set_many()
现在返回插入失败的键列表。对于内置后端,失败的插入只能在memcached上发生。
File.open()
可以用作上下文管理器,例如 with file.open() as f:
.
新的 date_attrs
和 time_attrs
参数的理由 SplitDateTimeWidget
和 SplitHiddenDateTimeWidget
允许为指定不同的HTML属性 DateInput
和 TimeInput
(或隐藏)子桥。
新的 Form.errors.get_json_data()
方法将表单错误作为适合包含在JSON响应中的字典返回。
新的 ContextMixin.extra_context
属性允许在中添加上下文 View.as_view()
.
inspectdb
现在将mysql的无符号整数列转换为 PositiveIntegerField
或 PositiveSmallIntegerField
.
新的 makemessages --add-location
选项控制中的注释格式 .po
档案。
loaddata
现在可以 read from stdin .
新的 diffsettings --output
选项允许以统一的diff格式格式化输出。
关于Oracle, inspectdb
现在可以反省 AutoField
如果列被创建为标识列。
关于MySQL, dbshell
现在支持客户端TLS证书。
新的 squashmigrations --squashed-name
选项允许命名压缩的迁移。
新的 StrIndex
数据库函数在另一个字符串中查找字符串的起始索引。
在甲骨文上, AutoField
and BigAutoField
are now created as identity columns 。
新的 chunk_size
参数 QuerySet.iterator()
控制从数据库中流式处理结果时,python数据库客户端获取的行数。对于不支持服务器端游标的数据库,它控制从数据库适配器获取的Django结果数。
QuerySet.earliest()
, QuerySet.latest()
和 Meta.get_latest_by
现在允许按几个字段排序。
增加了 ExtractQuarter
从中提取季度的函数 DateField
和 DateTimeField
把它暴露在 quarter
查找。
增加了 TruncQuarter
要截断的函数 DateField
和 DateTimeField
一个季度的第一天。
增加了 db_tablespace
基于类的索引的参数。
如果数据库支持本机持续时间字段(Oracle和PostgreSQL)。 Extract
现在工作 DurationField
.
增加了 of
参数 QuerySet.select_for_update()
在PostgreSQL和Oracle上支持,只锁定特定表中的行,而不锁定所有选定表。特别是当 select_for_update()
与一起使用 select_related()
.
新的 field_name
参数 QuerySet.in_bulk()
允许基于任何唯一的模型字段提取结果。
CursorWrapper.callproc()
现在,如果后端支持此功能,则采用关键字参数的可选字典。在Django的内置后端中,只有Oracle支持它。
新的 connection.execute_wrapper()
方法允许 installing wrappers around execution of database queries .
新的 filter
内置聚合的参数允许 adding different conditionals 对同一字段或关系进行多个聚合。
添加了对中表达式的支持 Meta.ordering
.
新的 named
参数 QuerySet.values_list()
允许以命名元组的形式提取结果。
新的 FilteredRelation
类允许添加 ON
子句到查询集。
补充 Paginator.get_page()
提供处理无效页码的文档化模式。
这个 runserver
Web服务器支持HTTP1.1。
提高 Engine.get_default()
在第三方应用程序中,如果有多个引擎,它现在返回第一个引擎 DjangoTemplates
引擎配置在 TEMPLATES
而不是提高 ImproperlyConfigured
.
自定义模板标记现在可以只接受关键字参数。
为添加线程支持 LiveServerTestCase
.
添加了允许为Oracle自定义测试表空间参数的设置: DATAFILE_SIZE
, DATAFILE_TMP_SIZE
, DATAFILE_EXTSIZE
和 DATAFILE_TMP_EXTSIZE
.
新的 ProhibitNullCharactersValidator
不允许在 CharField
窗体域及其子类。从漏洞扫描工具中观察到空字符输入。大多数数据库都会悄悄地丢弃空字符,但是psycopg2 2.7+在尝试用postgresql将空字符保存到char/text字段时引发异常。
为了支持原生Python 2字符串,较旧的Django版本必须同时接受字节串和Unicode字符串。既然Python 2支持已被放弃,字节串应该只在输入/输出边界(例如,处理二进制字段或HTTP流)周围遇到。您可能必须更新代码以将字节串的使用限制在最低限度,因为Django不再接受某些代码路径中的字节串。Python的 -b
选项可能有助于检测代码中的错误。
例如, reverse()
现在使用 str()
而不是 force_text()
胁迫 args
和 kwargs
它会在它们放置在URL中之前接收它们。对于bytestrings,这将创建一个带有不需要的字符串 b
前缀和附加引号 (str(b'foo')
是 "b'foo'"
)适应,呼唤 decode()
在把它传递给 reverse()
.
本节描述第三方数据库后端可能需要的更改。
这个 DatabaseOperations.datetime_cast_date_sql()
, datetime_cast_time_sql()
, datetime_trunc_sql()
, datetime_extract_sql()
和 date_interval_sql()
方法现在只返回SQL来执行操作,而不返回SQL和参数列表。
第三方数据库后端应添加 DatabaseWrapper.display_name
具有您的后端使用的数据库名称的属性。Django可以在各种消息中使用它,例如在系统检查中。
第一个论点 SchemaEditor._alter_column_type_sql()
现在是 model
而不是 table
.
第一个论点 SchemaEditor._create_index_name()
现在是 table_name
而不是 model
.
使能 FOR UPDATE OF
支持,设置 DatabaseFeatures.has_select_for_update_of = True
. 如果数据库要求 OF
是列而不是表,集 DatabaseFeatures.select_for_update_of_column = True
.
支持 Window
表达式,集 DatabaseFeatures.supports_over_clause
到 True
. 您可能需要自定义 DatabaseOperations.window_start_rows_start_end()
和/或 window_start_range_start_end()
方法。
第三方数据库后端应添加 DatabaseOperations.cast_char_field_without_max_length
属性的数据库数据类型将在 Cast
A函数 CharField
如果 max_length
未提供参数。
第一个论点 DatabaseCreation._clone_test_db()
和 get_test_db_clone_settings()
现在是 suffix
而不是 number
(以防为了一致性而重命名后端中的签名)。 django.test
现在也将这些值作为字符串而不是整数传递。
第三方数据库后端应添加 DatabaseIntrospection.get_sequences()
基于存根的方法 BaseDatabaseIntrospection
.
Oracle 11.2的上游支持将于2020年12月结束。Django 1.11将得到支持,直到2020年4月,几乎达到这个日期。Django 2.0正式支持Oracle 12.1+。
MySQL的默认隔离级别(repeatable read)在典型的django使用中可能会导致数据丢失。为了防止这种情况发生并保持与其他数据库的一致性,现在默认的隔离级别是读提交。你可以使用 DATABASES
设置为 use a different isolation level ,如果需要的话。
AbstractUser.last_name
max_length
增加到150¶迁徙 django.contrib.auth.models.User.last_name
包括在内。如果有自定义用户模型继承自 AbstractUser
,您需要为您的用户模型生成和应用数据库迁移。
如果要保留姓氏的30个字符限制,请使用自定义格式::
from django.contrib.auth.forms import UserChangeForm
class MyUserChangeForm(UserChangeForm):
last_name = forms.CharField(max_length=30, required=False)
如果您希望在编辑用户时在管理员中保留此限制,请设置 UserAdmin.form
使用此表单:
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
class MyUserAdmin(UserAdmin):
form = MyUserChangeForm
admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)
QuerySet.reverse()
和 last()
切片后禁止使用¶叫唤 QuerySet.reverse()
或 last()
由于切片在重新排序后被应用,切片查询集上的查询会导致意外的结果。现在禁止这样做,例如:
>>> Model.objects.all()[:2].reverse()
Traceback (most recent call last):
...
TypeError: Cannot reverse a query once a slice has been taken.
为了帮助防止由于表单字段参数顺序不正确而导致运行时错误,内置表单字段的可选参数不再被接受为位置参数。例如::
forms.IntegerField(25, 10)
引发异常,应替换为::
forms.IntegerField(max_value=25, min_value=10)
call_command()
验证它收到的选项¶call_command()
现在验证正在调用的命令的参数分析器是否定义了传递给 call_command()
.
对于使用选项而不是使用创建选项的自定义管理命令 parser.add_argument()
,添加一个 stealth_options
命令的属性:
class MyCommand(BaseCommand):
stealth_options = ("option_name", ...)
例如::
models.Index(["headline", "-pub_date"], "index_name")
引发异常,应替换为::
models.Index(fields=["headline", "-pub_date"], name="index_name")
这将显示为向后不兼容的更改 (IntegrityError: FOREIGN KEY constraint failed
)如果试图保存违反外键约束的现有模型实例。
现在使用创建外键 DEFERRABLE INITIALLY DEFERRED
而不是 DEFERRABLE IMMEDIATE
. 因此,可能需要重新构建表,以使用新定义重新创建外键,特别是在使用这样的模式时:
from django.db import transaction
with transaction.atomic():
Book.objects.create(author_id=1)
Author.objects.create(id=1)
如果不将外键重新创建为 DEFERRED
第一 create()
如果强制使用外键约束,将失败。
首先备份数据库!升级到django 2.0后,可以使用类似以下脚本重新生成表:
from django.apps import apps
from django.db import connection
for app in apps.get_app_configs():
for model in app.get_models(include_auto_created=True):
if model._meta.managed and not (model._meta.proxy or model._meta.swapped):
for base in model.__bases__:
if hasattr(base, "_meta"):
base._meta.local_many_to_many = []
model._meta.local_many_to_many = []
with connection.schema_editor() as editor:
editor._remake_table(model)
这个脚本没有得到广泛的测试,需要适应各种情况,如多个数据库。随时为改进做出贡献。
另外,由于sqlite的表修改限制,禁止执行 RenameModel
和 RenameField
对事务中其他模型引用的模型或字段的操作。为了允许应用包含这些操作的迁移,必须设置 Migration.atomic
属性到 False
.
这个 SessionAuthenticationMiddleware
类被删除。由于在Django 1.10中无条件地启用了会话身份验证,因此它没有提供任何功能。
默认的HTTP错误处理程序 (handler404
等等)现在是可调用的,而不是点状的python路径字符串。Django支持可调用引用,因为它们提供了更好的性能和调试经验。
RedirectView
不再沉默 NoReverseMatch
如果 pattern_name
不存在。
什么时候 USE_L10N
已关闭, FloatField
和 DecimalField
现在请尊重 DECIMAL_SEPARATOR
和 THOUSAND_SEPARATOR
在验证期间。例如,使用以下设置::
USE_L10N = False
USE_THOUSAND_SEPARATOR = True
DECIMAL_SEPARATOR = ","
THOUSAND_SEPARATOR = "."
一个输入 "1.345"
现在转换为 1345
而不是 1.345
.
亚类 AbstractBaseUser
不再需要执行 get_short_name()
和 get_full_name()
. (提升 NotImplementedError
被移除。 django.contrib.admin
如果实现了这些方法,则使用它们,但不需要它们。使用这些方法的第三方应用程序可能希望采用类似的方法。
这个 FIRST_DAY_OF_WEEK
和 NUMBER_GROUPING
格式设置现在在javascript和json i18n视图输出中保持为整数。
assertNumQueries()
现在忽略连接配置查询。以前,如果测试打开了一个新的数据库连接,那么这些查询可以作为 assertNumQueries()
伯爵。
Oracle测试表空间的默认大小从20米增加到50米,默认的自动扩展大小从10米增加到25米。
为了提高从数据库中流式处理大型结果集时的性能, QuerySet.iterator()
现在一次提取2000行而不是100行。可以使用 chunk_size
参数。例如::
Book.objects.iterator(chunk_size=100)
在中提供未知的包名称 packages
论证 JavaScriptCatalog
视图现在升高 ValueError
而不是静静地走过。
模型实例的主键现在显示在默认值中 Model.__str__()
方法,例如 Question object (1)
.
makemigrations
现在检测模型字段的更改 limit_choices_to
选择权。将其添加到现有迁移中,或者接受使用它的字段的自动生成迁移。
执行需要的查询 automatic spatial transformations 现在提出 NotImplementedError
在mysql上,而不是静默地使用未转换的几何体。
django.core.exceptions.DjangoRuntimeWarning
被移除。它仅在缓存后端中用作 CacheKeyWarning
的继承权 RuntimeWarning
.
更名 BaseExpression._output_field
到 output_field
. 可能需要更新自定义表达式。
在旧版本中,表单和表单集结合了 Media
使用控件 Media
将两者串联起来。组合现在试图 preserve the relative order of elements in each list . MediaOrderConflictWarning
如果订单无法保存,则发出。
django.contrib.gis.gdal.OGRException
被移除。它是 GDALException
从Django 1.8开始。
不再支持geos 3.3.x。
数据的选择方式 GeometryField
更改以提高性能,在原始SQL查询中,现在必须将这些字段包装在 connection.ops.select
. 见 Raw queries note 以GIS教程为例。
context
argument of Field.from_db_value()
and Expression.convert_value()
¶这个 context
的参数 Field.from_db_value()
和 Expression.convert_value()
未使用,因为它总是一本空字典。这两种方法的签名现在是:
(self, value, expression, connection)
而不是::
(self, value, expression, connection, context)
在Django3.0之前,对自定义字段和表达式中旧签名的支持仍然存在。
这个 django.db.backends.postgresql_psycopg2
模块已弃用,取而代之的是 django.db.backends.postgresql
. 从Django 1.9开始,它就是一个别名。这只影响直接从模块导入的代码。这个 DATABASES
设置仍可以使用 'django.db.backends.postgresql_psycopg2'
尽管您可以通过使用 'django.db.backends.postgresql'
在Django 1.9中添加的名称。
django.shortcuts.render_to_response()
被否决,赞成 django.shortcuts.render()
. render()
采用相同的参数,但它还需要 request
.
这个 DEFAULT_CONTENT_TYPE
设置已弃用。它与第三方应用程序的交互不好,而且已经过时了,因为HTML5已经取代了XHTML。
HttpRequest.xreadlines()
已弃用,赞成对请求进行迭代。
这个 field_name
关键字参数 QuerySet.earliest()
和 QuerySet.latest()
不赞成将字段名作为参数传递。写 .earliest('pub_date')
而不是 .earliest(field_name='pub_date')
.
这些功能已达到其折旧周期的末尾,并在Django 2.0中删除。
见 1.9中不推荐的功能 有关这些更改的详细信息,包括如何删除这些功能的用法。
这个 weak
参数 django.dispatch.signals.Signal.disconnect()
被移除。
django.db.backends.base.BaseDatabaseOperations.check_aggregate_support()
被移除。
这个 django.forms.extras
包已删除。
这个 assignment_tag
助手已删除。
这个 host
参数 SimpleTestCase.assertsRedirects()
被移除。当路径相同时,允许绝对URL被视为等于相对URL的兼容性层也被删除。
Field.rel
和 Field.remote_field.to
被移除。
这个 on_delete
的参数 ForeignKey
和 OneToOneField
现在在模型和迁移中是必需的。考虑挤压迁移,这样更新的迁移就更少了。
django.db.models.fields.add_lazy_relation()
被移除。
当启用时区支持时,不支持时区的数据库后端不再以UTC格式将已知日期时间转换为原始值,当这些值作为参数传递给在ORM外部执行的SQL查询时,例如使用 cursor.execute()
.
django.contrib.auth.tests.utils.skipIfCustomUser()
被移除。
这个 GeoManager
和 GeoQuerySet
类被删除。
这个 django.contrib.gis.geoip
模块被移除。
这个 supports_recursion
检查模板加载程序是否从以下位置删除:
django.template.engine.Engine.find_template()
django.template.loader_tags.ExtendsNode.find_template()
django.template.loaders.base.Loader.supports_recursion()
django.template.loaders.cached.Loader.supports_recursion()
这个 load_template
和 load_template_sources
模板加载器方法被删除。
这个 template_dirs
模板加载程序的参数已删除:
django.template.loaders.base.Loader.get_template()
django.template.loaders.cached.Loader.cache_key()
django.template.loaders.cached.Loader.get_template()
django.template.loaders.cached.Loader.get_template_sources()
django.template.loaders.filesystem.Loader.get_template_sources()
django.template.loaders.base.Loader.__call__()
被移除。
支持不接受 exception
参数已删除。
这个 mime_type
属性 django.utils.feedgenerator.Atom1Feed
和 django.utils.feedgenerator.RssFeed
被移除。
这个 app_name
参数 include()
被移除。
支持传递3元组(包括 admin.site.urls
)作为第一个论点 include()
被移除。
已删除对设置没有应用程序命名空间的URL实例命名空间的支持。
Field._get_val_from_obj()
被移除。
django.template.loaders.eggs.Loader
被移除。
这个 current_app
参数 contrib.auth
基于函数的视图将被删除。
这个 callable_obj
关键字参数 SimpleTestCase.assertRaisesMessage()
被移除。
支持 allow_tags
属性对 ModelAdmin
方法被移除。
这个 enclosure
关键字参数 SyndicationFeed.add_item()
被移除。
这个 django.template.loader.LoaderOrigin
和 django.template.base.StringOrigin
用于别名 django.template.base.Origin
被移除。
见 1.10中不推荐的功能 有关这些更改的详细信息。
这个 makemigrations --exit
选项被删除。
取消了对反向外键或多对多关系的直接分配的支持。
这个 get_srid()
和 set_srid()
方法 django.contrib.gis.geos.GEOSGeometry
被移除。
这个 get_x()
, set_x()
, get_y()
, set_y()
, get_z()
和 set_z()
方法 django.contrib.gis.geos.Point
被移除。
这个 get_coords()
和 set_coords()
方法 django.contrib.gis.geos.Point
被移除。
这个 cascaded_union
性质 django.contrib.gis.geos.MultiPolygon
被移除。
django.utils.functional.allow_lazy()
被移除。
这个 shell --plain
选项被删除。
这个 django.core.urlresolvers
移除模块以利于其新位置, django.urls
.
CommaSeparatedIntegerField
已删除,但历史迁移中的支持除外。
模板 Context.has_key()
方法已删除。
支持 django.core.files.storage.Storage.accessed_time()
, created_time()
和 modified_time()
方法被移除。
当 Meta.default_related_name
设置被删除。
MySQL __search
查找已删除。
用于支持自定义相关管理器类的填充程序 _apply_rel_filters()
方法已删除。
使用 User.is_authenticated()
和 User.is_anonymous()
因为不再支持方法而不是属性。
这个 Model._meta.virtual_fields
属性被删除。
关键字参数 virtual_only
在里面 Field.contribute_to_class()
和 virtual
在里面 Model._meta.add_field()
被移除。
这个 javascript_catalog()
和 json_catalog()
视图被删除。
django.contrib.gis.utils.precision_wkt()
被移除。
在多表继承中,隐式提升 OneToOneField
到A parent_link
被移除。
支持 Widget._format_value()
被移除。
FileField
方法 get_directory_name()
和 get_filename()
被移除。
这个 mark_for_escaping()
函数及其使用的类: EscapeData
, EscapeBytes
, EscapeText
, EscapeString
和 EscapeUnicode
被移除。
这个 escape
过滤器现在使用 django.utils.html.conditional_escape()
.
Manager.use_for_related_fields
被移除。
模型 Manager
继承遵循MRO继承规则。使用要求 Meta.manager_inheritance_from_future
选择加入行为将被删除。
支持旧式中间件使用 settings.MIDDLEWARE_CLASSES
被移除。
7月 22, 2024