モデルを自由にカスタムする。Django/DjangoRestFrameworkアプリのmodelの変数名、フィールド名を変更する〜herokuへのデプロイ反映までの方法メモ

# はじめに

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```に空のマイグレーションファイルができる

```#0012_auto_20200610_0000.py
from django.db import migrations


class Migration(migrations.Migration):

    dependencies = [
        ('<app名>', '0011_auto_20200610_1111'),
    ]

    operations = [
    ]
```

## 3:マイグレーションファイルに変数書き換え指示を書き込む

### (1)変更１つの場合

```#0012_auto_20200610_0000.py
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つ以上の場合

```#0012_auto_20200610_0000.py
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```に空のマイグレーションファイルができる

```#0012_auto_20200610_0000.py
from django.db import migrations


class Migration(migrations.Migration):

    dependencies = [
        ('<app名>', '0011_auto_20200610_1111'),
    ]

    operations = [
    ]
```
## 3:マイグレーションファイルに変数書き換え指示を書き込む

```from django.db import migrations, models```

に```models```のインポートを追記しないとエラーになるのでお気をつけください。

```#0012_auto_20200610_0000.py
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機能の学習ノート（３）
https://qiita.com/pumbaacave/items/8b6f8d96ddc7cc112827

Change column type with django migrations
https://stackoverflow.com/questions/27385118/change-column-type-with-django-migrations