关于Django 2.0的变更点

本文是Django Advent Calendar 2017的第二天的文章。

我們將介紹長達9年的Django 2.0的重大版本更新。

在Django 2.0中,停止支持Python2系列,仅支持Python3.4/3.5/3.6。

Django 2.0 路线图

DateProcess2017/09/18Django 2.0 alpha; feature freeze.2017/10/16Django 2.0 beta; non-release blocking bug fix freeze.2017/11/15Django 2.0 RC 1; translation string freeze.2+ weeks after RC1Django 2.0 final (or RC 2, if needed).

目前已发布了 Django 2.0rc1。

如果一切顺利,预计Django2.0的正式发布将在12月中旬宣布。

补充说明

Django 2.0于12/2发布成功,仅仅数小时后写完了这篇文章!

全新功能

簡單的URL路由語法

除了使用传统正则表达式的方式(django.conf.urls.url()),现在还可以使用新的简单方式(django.urls.path())。

url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
path('articles/<int:year>/', views.year_archive),

移动设备友好的contrib.admin

管理员界面已实现响应式设计。

Django 1.1可以被解释为“Django一点一版”。

スクリーンショット 2017-12-02 09.22.16.png

Django 2.0 是 Django 的第二个版本。

スクリーンショット 2017-12-02 09.16.24.png

窗户标记

    OVER句を追加できるWindow表記が導入されました。

精細的功能組合

运行的服务器支持HTTP 1.1等其他细微的新功能。建议您快速浏览一下文档。

不具备后向兼容性的更改

    • I/Oまわりを除いて、bytestringsは使用不可

Python2系のサポート切るため

DBバックエンドAPIの変更

サードパーティのDBバックエンドで必要となる変更点
https://docs.djangoproject.com/en/2.0/releases/2.0/#database-backend-api

Oracle 11.2をサポート外

Django1.11でサポートしていく

MySQLの分離レベルのデフォルト設定をrepeatable readからread committedに変更

AbstractUser.last_nameのmax_lengthが150文字までに増加

AbstractUserを使っている場合は、新たにmigrationを適用する必要あり

スライス後の、QuerySet.reverse()QuerySet.last()は使用禁止

>>> Model.objects.all()[:2].reverse()
Traceback (most recent call last):
...
TypeError: Cannot reverse a query once a slice has been taken.

Form fieldsへの位置引数を禁止

forms.IntegerField(25, 10)

forms.IntegerField(max_value=25, min_value=10)

call_commandのオプション指定方法に、parser.add_argument 加えて stealth_options という簡単な設定が可能に

以下はflushcommandの実装を一部抜粋したもの

class Command(BaseCommand):
    help = (
        'Removes ALL DATA from the database, including data added during '
        'migrations. Does not achieve a "fresh install" state.'
    )
    stealth_options = ('reset_sequences', 'allow_cascade', 'inhibit_post_migrate')

    def add_arguments(self, parser):
        parser.add_argument(
            '--noinput', '--no-input', action='store_false', dest='interactive',
            help='Tells Django to NOT prompt the user for input of any kind.',
        )
        parser.add_argument(
            '--database', action='store', dest='database', default=DEFAULT_DB_ALIAS,
            help='Nominates a database to flush. Defaults to the "default" database.',
        )

    def handle(self, **options):
        database = options['database']
        connection = connections[database]
        verbosity = options['verbosity']
        interactive = options['interactive']
        # The following are stealth options used by Django's internals.
        reset_sequences = options.get('reset_sequences', True)
        allow_cascade = options.get('allow_cascade', False)
        inhibit_post_migrate = options.get('inhibit_post_migrate', False)

models.Indexへの位置引数を禁止

models.Index([‘headline’, ‘-pub_date’], ‘index_name’)

models.Index(fields=[‘headline’, ‘-pub_date’], name=’index_name’)

外部キー制約をSQLiteでもできるように
その他

https://docs.djangoproject.com/en/2.0/releases/2.0/#miscellaneous

不建议使用的功能

Field.from_db_value()とExpression.convert_value()のcontext引数

context引数は常に空の辞書として使われる
Django3.0で削除予定

その他

https://docs.djangoproject.com/en/2.0/releases/2.0/#id1

总结

我已经查看了Django2.0的更改内容,作为迁移准备,让我们从1.11环境中解决RemovedInDjango20Warning。(可以使用$ python -Wd manage.py命令检测到RemovedInDjango20Warning。)

广告
将在 10 秒后关闭
bannerAds