自動化無しに生活無し

WEBとかAIとかLinux関係をひたすら書く備忘録系ブログ

Djangoでmakemigrationsコマンドを実行しても、No changes detectedと言われる場合の対処法

thumbnail

Djangoでマイグレーションファイルを作る

python3 manage.py makemigrations 

このコマンドを実行しても返ってくるのが、

No changes detected

とされ、マイグレーションファイルが作られないことがある。当然この状態でmigrateコマンドを打ってもDBには反映されない。

そこで、本記事ではこの対処法について列挙する。

対処法1:settings.pyのINSTALLED_APPSに対象のアプリを追加

python3 manage.py makemigrations 
python3 manage.py migrate

この2つのコマンドを打って、models.py(モデル)に書かれた内容をDBに反映させるのだが、その際にモデルが読み込まれるのは、settings.pyINSTALLED_APPSに追加されたアプリだけである。

つまり、settings.pyINSTALLED_APPSに追加されていなければ、いくらモデルを正しく記述してもDBには反映されない。故に『No changes detected』と言われてしまう。

対処法2:makemigrationsにアプリ名を追加する。

マイグレーションファイル作る時、

python3 manage.py makemigrations 

ではなく、

python3 manage.py makemigrations [アプリ名]

とする。これでマイグレーションファイルが作られる。この状態が起こりうるのは、[アプリ名]migrationsディレクトリを手動で削除した時。

migrationsディレクトリを削除して、1から作り直したいときなどにハマることがあるので、そのときは上記コマンドの用に[アプリ名]を明示的に指定してマイグレーションファイルを作らせる。

対処法3:migrationsディレクトリをチェックする

実はすでにmakemigrationsでマイグレーションファイルが作られていて、『No changes detected』と言われているパターン。

アプリディレクトリ内にあるmigrationsディレクトリをチェックする。models.pyの変更がマイグレーションファイルに反映されているかチェックする。同時に、models.pyを編集した後、保存していないかもチェックする。

models.pyが書き換わり、保存され、なおかつINSTALLED_APPSにアプリが追加されている場合に限り、アプリが作られる点に注意する。

結論

Djangoのマイグレーションファイル生成はLaravelなどと違って、コマンド一発の自動生成なので、ハマる場合はかなりハマる。

自動生成は便利ではあるが、モデル変更の解釈も自動生成に委ねられるので、気に入らない場合は自分でマイグレーションファイルを書き換えする必要がある。この辺りも初見殺しとしか。

スポンサーリンク

シェアボタン

Twitter LINEで送る Facebook はてなブログ