はじめに
Djangoのmodels.pyって一度いじったら変更するのが他のviews.pyと比べてデータベースと連携しているので、とても面倒そうなイメージがありますが、この度解決法がまとまったので自分なりに丁寧に記載してみました。わかりにくかったら、すみません。
検証環境
Python==3.6.1
Django==2.2.1
djangorestframework==3.11.0
その1:modelの変数名を変更する方法
「models.pyのマイグレーション完了!あ、変数名をタイプミス発見。。。書き換えてマイグレーション($python manage.py makemigratios → $python manage.py migrate
)で、エラー・・・何やってもエラー・・・どうしよう」
これを解決する方法です。
1:マイグレーションファイルを作成する
コマンドを打ちます
$ python manage.py makemigrations --empty <app名>
Migrations for '<app名>':
<app名>/migrations/0012_auto_20200610_0000.py
2:<app名>/migrations
に空のマイグレーションファイルができる
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('<app名>', '0011_auto_20200610_1111'),
]
operations = [
]
3:マイグレーションファイルに変数書き換え指示を書き込む
(1)変更1つの場合
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('<app名>', '0011_auto_20200610_1111'),
]
operations = [
migrations.RenameField(
model_name='<app内部の変更したいmodel名>',
old_name='image1Discription', #例:変更したい変数名
new_name='image1Description' #例:変更後の変数名
)
]
(2)変更2つ以上の場合
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('<app名>', '0011_auto_20200610_1111'),
]
operations = [
migrations.RenameField(
model_name='<app内部の変更したいmodel名>',
old_name='image1Discription', #例:変更したい変数名
new_name='image1Description' #例:変更後の変数名
),
migrations.RenameField(
model_name='<app内部の変更したいmodel名>',
old_name='image2Discription', #例:変更したい変数名
new_name='image2Description' #例:変更後の変数名
)
]
4:ローカルでmigrate テスト
settings.pyのDBはローカル指定を忘れずに。
$ python manage.py migrate
Running migrations:
Applying realestatedb.0012_auto_20200610_0000... OK
これでローカルのdb(postgreなど)は変更できました。models.pyはDB以外のアプリの挙動に関わるので、今動かしても503エラーになりますが、後の行程でmodels.pyに変更を書き込めばエラー直ります。
5:herokuにアップしてリモートでも同様の実施
settings.pyのDBはリモート指定を忘れずに。
$ git add .
$ git commit -m "db revise"
$ git push heroku master
(待機)
$ heroku run python manage.py migrate
Running migrations:
Applying realestatedb.0012_auto_20200610_0000... OK
これでとりあえずリモートのDBはOKです。
6:models.pyや、views.py serializers.pyなど変えてherokuにデプロイ。
$ git add .
$ git commit -m "db revise"
$ git push heroku master
(待機)
動作確認してOKなら完了です。models.pyいじったからと言って、すでにマイグレーションは終わっているので、さらにマイグレーションする必要ないです。
その2:modelのフィールドのデータ型を変更する方法
「models.pyのマイグレーション完了!あ、この変数Intかと思ったら、Intじゃなくて日時だからDatetimeじゃん・・・ミスった。。。書き換えてマイグレーション($python manage.py makemigratios → $python manage.py migrate
)で、エラー・・・何やってもエラー・・・どうしよう」
これを解決する方法です。
1:マイグレーションファイルを作成する
$ python manage.py makemigrations --empty realestatedb
Migrations for 'realestatedb':
realestatedb/migrations/0012_auto_20200610_0000.py
2:<app名>/migrations
に空のマイグレーションファイルができる
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('<app名>', '0011_auto_20200610_1111'),
]
operations = [
]
3:マイグレーションファイルに変数書き換え指示を書き込む
from django.db import migrations, models
にmodels
のインポートを追記しないとエラーになるのでお気をつけください。
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('<app名>', '0011_auto_20200610_1111'),
]
operations = [
migrations.AlterField(
model_name='<app内部の変更したいmodel名>',
name='FeePayDate', #例:変更したい変数名
field=models.DateTimeField(blank=True, null=True), #例:変更後のデータ型名
),
]
4:ローカルでmigrate テスト
settings.pyのDBはローカル指定を忘れずに。
$ python manage.py migrate
Running migrations:
Applying realestatedb.0012_auto_20200610_0000... OK
これでローカルのdb(postgreなど)は変更できました。models.pyはDB以外のアプリの挙動に関わるので、今動かしても503エラーになりますが、後の行程でmodels.pyに変更を書き込めばエラー直ります。
5:herokuにアップしてリモートでも同様の実施
settings.pyのDBはリモート指定を忘れずに。
$ git add .
$ git commit -m "db field revise"
$ git push heroku master
(待機)
$ heroku run python manage.py migrate
Running migrations:
Applying realestatedb.0012_auto_20200610_0000... OK
これでとりあえずリモートのDBはOKです。
6:models.pyや、views.py serializers.pyなど変えてherokuにデプロイ。
$ git add .
$ git commit -m "db field revise"
$ git push heroku master
(待機)
動作確認してOKなら完了です。models.pyいじったからと言って、すでにマイグレーションは終わっているので、さらにマイグレーションする必要ないです。
参考記事
Django3でテーブルのカラム(フィールド)名を変更する
https://qiita.com/holly0819/items/41f01096f59416b0d52b
Djangoフレームワークにおけるmigrations機能の学習ノート(3)
https://qiita.com/pumbaacave/items/8b6f8d96ddc7cc112827
Change column type with django migrations
https://stackoverflow.com/questions/27385118/change-column-type-with-django-migrations