今回の内容
前回はDjangoの特徴をおさらいしてから、環境構築とDjangoでのプロジェクト構成について解説しました。第2回となる今回は、まず昨年末リリースされたDjango 2.0について見ていきます。Django 2.0の環境へ移行した後、実際のアプリケーション開発を進めながらDjangoのモデルの定義について解説します。そこでは実践的なTipsも合わせて紹介しています。
そして後半ではRESTful APIを開発するうえで、Django REST frameworkの導入からシリアライザーやルーターといった基本的な実装までを扱っていきます。
Django 2.0
前回の環境構築において、執筆当時最新であったDjango 1.11.6を使用しました。その後2017年12月に、Django 2.0がリリースされました。本連載のタイトルは『モダンDjango入門』ですので、これ以降はDjangoの2系について解説していきます。まずはDjango 2.0で変更があったポイントと新しく追加された機能を確認してから、Djangoのバージョンアップを行います。
Python 2系のサポート切れ
Django 2.0での一番大きな変更は、Python 2系のサポートを打ち切ったことです。Django 2.0で動作が保証されているPythonのバージョンは、3.4/3.5/3.6のみとなっています。Python 2/3の互換性を維持するために内部で行われていた処理を削ったことにより、パフォーマンスの向上にもつながっています。
主な新機能
Django 2.0から加わった主な新機能として、次の3つが挙げられます。
シンプルなURLルーティング構文
従来の正規表現を用いた書き方に加えて、よりシンプルで読みやすい書き方でURLルーティングが設定できるようになりました。
これまでのURLルーティングはdjango.conf.urls.url()
関数を使って、次のように書いていました。
url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
これが今回加わったdjango.urls.path()
関数を用いると、以下のように書き換えられます。
path('articles/<int:year>/', views.year_archive),
正規表現を用いると、柔軟な設定が可能です。しかしその反面、正規表現に慣れていない人にとっては難しく感じられたり、正規表現が必要となる複雑なルーティングが求められるケースは多くないという意見がありました。
Django 2.0では用途に合わせてURLルーティングの書き方を選べるようになったので、より使いやすいものとなりました。
モバイルフレンドリーなcontrib.admin
管理サイトがレスポンシブ対応になり、スマートフォンなどでも画面サイズにあわせたレイアウトが表示されるようになりました。
Window関数
SQLのOVER句が新たに使えるようになりました。
他にもmanage.py runserver
で立ち上がるサーバがHTTP/1.1に対応するなど、細かい新機能や変更点が含まれています。より詳しく知りたい方は、以下のリリースノートをご覧ください。
Django 2.0への移行
それでは前回作成したプロジェクトのDjangoバージョンをアップグレードしましょう。
仮想環境をactivateしてから、pipコマンドでDjangoのアップグレードを行います。
$ source env/bin/activate (env) $ pip install -U Django Collecting Django Downloading Django-2.0.2-py3-none-any.whl (7.1MB) 100% |████████████████████████████████| 7.1MB 218kB/s Requirement already up-to-date: pytz in ./env/lib/python3.6/site-packages (from Django) Installing collected packages: Django Found existing installation: Django 1.11.6 Uninstalling Django-1.11.6: Successfully uninstalled Django-1.11.6 Successfully installed Django-2.0.2
執筆時最新のバージョンである2.0.2がインストールされました。合わせて前回インストールしたdjango-extensionsもDjango 2.0に対応したバージョンがリリースされているのでアップグレードしておきましょう。
(env) $ pip install -U django-extensions ... Successfully installed django-extensions-1.9.9 typing-3.6.4
requirements
配下のbase.txt
とlocal.txt
も忘れずに更新しておきます。
それではさっそく、manage.py runserver
コマンドで開発サーバを起動させましょう。
(env) $ python manage.py runserver Performing system checks... System check identified no issues (0 silenced). You have 1 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): auth. Run 'python manage.py migrate' to apply them. January 27, 2018 - 08:05:30 Django version 2.0.2, using settings 'config.settings.local' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.
ブラウザからhttp://127.0.0.1:8000/にアクセスすると、Django 2.0で新しくデザインされた次の画面が表示されます。
次にhttp://127.0.0.1:8000/adminにログインして、管理サイトも確認してみましょう。Chrome DevToolsなどを使ってモバイル端末のシミュレートを行うと、管理サイトがレスポンシブ対応になったことがわかります。
またmanage.py runserver
を実行した際に、適用されていないマイグレーションが1つあるというメッセージが表示されていました。このマイグレーションは、Django 2.0でAbstractUser.last_name
のmax_lengthが30文字から150文字に変わったためです。manage.py migrate
コマンドでマイグレーションを実行しておきましょう。
(env) $ python manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, sessions Running migrations: Applying auth.0009_alter_user_last_name_max_length... OK
最後にconfig/urls.py
を編集して、新しいURLルーティング構文を使うようにしましょう。
from django.contrib import admin from django.urls import path urlpatterns = [ path('admin/', admin.site.urls), ]
幸い環境構築までしか行っていなかったので、今回は何の心配もなくDjango 2.0へ移行できました。しかし実際に運用中のDjangoアプリケーションではそうはいきません。後方互換性のない変更によって、アプリケーションが動かなくなる可能性があります。
安全なアップグレードのために、Djangoでは非推奨な機能を使っていないかどうかチェックできるようになっています。python -Wd manage.py
とオプション付きで実行することで、デフォルトでは非表示となっている警告を検知できます。Django 2.0から使えなくなる機能を使用している場合には、RemovedInDjango20Warningという警告が表示されます。Django 1.11の環境でこのRemovedInDjango20Warningを解消してから、2.0へのアップグレードを行うことをお勧めします。