年末の最初の作業は、django-2.0への準備作業で少しずつプログラムを直しています。
対応は以下の感じです。
django-1.8とdjnago-1.11の両方に対応していたものを、django-1.8向け互換コードの対応終了を宣言。
djnago-1.11で、"python3 -Wd manage.py 0.0.0.0:8000"と起動して、RemovedInDjango20Warningを表示させて、地道に直していく。
RemovedInDjango20Warningが消えたら、djnago-1.11で動作確認。
djnago-2.0をインストールしてさらなる動作確認。エラーの箇所を直していく。
django-2.0対応で修正したポイントは以下。ちなみにDjango-2.0のリリースノートは こちら 。
models.pyのForeignKeyにon_deleteが必須になったので追加する。
User.is_authenticated()が関数のサポートが終了し、プロパティになったためUser.is_authenticatedに変更。
MIDDLEWAREで、SessionAuthenticationMiddlewareの指定が不要になったため削除。というか、指定しているとエラーになる。経緯としては、webフレームワークの機能として必須なので常に有効になったということらしい。
urls.pyで"include(admin.site.urls)"の部分が単に"admin.site.urls"でよくなった。
querysetで 以下のエラーが出たため、軽微な修正 を行った。
The QuerySet value for an exact lookup must be limited to one result using slicing.
mysqlを使っている場合の変更に対応。
DATABASESのOPTIONSに、'isolation_level': 'repeatable read'を追加。これはdjango-2.0からすべてのデータベースでread commitedがデフォルト指定になったため。
動かしてみると、ログイン認証の処理でエラーが発生。
django.db.utils.OperationalError: (1665, 'Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging. InnoDB is limited to row-logging when transaction isolation level is READ COMMITTED or READ UNCOMMITTED.')
my.cnfの設定で、binlog_format = MIXED に変更してエラーが出なくなった。