LoginSignup
2
3

More than 3 years have passed since last update.

Django:MigrationでモデルがDBに反映されない

Last updated at Posted at 2020-02-25

反映されない

表題の通り、DjangoからマイグレーションしてもDBに反映されず苦しんだので記録しておきます。

環境

・Windows10 Enterprise
・Docker Desktop for Windows:2.1.0.1
・MySQL:5.7.28(Docker上)
・Django:3.0(Docker上)

経緯

models.pyに新モデル(モデルAとします)を追加してマイグレーションを行った所、DBに反映されず。
他モデルの変更は反映されるので、モデルAのみ問題と推定。

色々やってみた

下記記事などを参考に色々やってみました。

・DjangoでmigrateしてるのにDBに反映されない時の対処法【Djangoアウトプット】
・DjangoでMigrationsのリセット方法(既存のデータベースを残したまま)
・djangoでmigrateができない
・Djangoのmodels.pyの反映(python manage.py makemigrations/migrate)
・modelにカラムを追加したのにmigrationファイルに追加されない現象
・python manage.py migrationが効かない時の対処法 [Django]

大体「python manage.py migrate --fake hoge zero」でマイグレーション履歴削除して、フォルダのファイルも削除後、makemigrationしてmigrateすれば反映されるでしょ、という事でしたが全滅。

おまえだったのか

で、一旦DBドロップして再度マイグレーションしてみると…モデルA以外にもうひとつモデル(モデルBとします)が反映されていない。
「?」と思いよくよく「models.py」を読んでいるとこれら2つのモデルのみ「class Meta:」の中に「managed = False」の文字が。

models.py
    class Meta:
        managed = False
        db_table = 'temp'

試しにこれを削除して再度マイグレーションしたら、出来ました。あっさりと。
基本的なところをよく理解していなかっただけでした。
モデルBはどこかからかコピーしてきた書式をペーストしていて、これをコピペしてモデルAを作成したので今回のトラップにかかった様です。
「managed = False」と書く事でマイグレーションの管理対象外とするそうな。そりゃ反映されない筈だ。
(「経緯」で他モデルの変更は反映されたと書いていますが、モデルBでは試していませんでした)

という訳で

コピー元がなぜこれを含んでいたかは謎ですが、一先ず動いたので…
灯台下暗し。もう少し手前から調べてみようと思いました。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3