关于Django 2.0的变更点
本文是Django Advent Calendar 2017的第二天的文章。
我們將介紹長達9年的Django 2.0的重大版本更新。
在Django 2.0中,停止支持Python2系列,仅支持Python3.4/3.5/3.6。
Django 2.0 路线图
目前已发布了 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一点一版”。
Django 2.0 是 Django 的第二个版本。
窗户标记
- 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。)