Django3でテーブルのカラム(フィールド)名を変更する方法
pollsアプリの、Questionモデルのpub_dataをpub_dateに変更する。
環境
- Python - 3.6.8
- Django - 3.0.2
- MySQL - 8.0.19
- CentOS7.7
やり方
空のマイグレーションファイルを作成
公式ドキュメントを参考に、コマンドラインで空のマイグレーションファイルを作成。
$ python3 manage.py makemigration --empty [アプリ名]
マイグレーションファイルの編集
すると、アプリ直下のpollsフォルダにマイグレーションファイルが作成される。
migrations/0002_auto_20200128_0044.py
# Generated by Django 3.0.2 on 2020-01-28 00:44
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('[アプリ名]', '0001_initial'),
]
operations = [
]
これを以下のように書き換える。
migrations/0002_auto_20200128_0044.py
# Generated by Django 3.0.2 on 2020-01-28 00:44
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('[アプリ名]', '0001_initial'),
]
operations = [
migrations.RenameField(
model_name='question', # モデル名
old_name='pub_data', # 変更前
new_name='pub_date' # 変更後
)
]
RenameFieldのところを書き換えれば、カラムやインデックスの追加、削除も同様にできる。詳しくは公式ドキュメントへ。
マイグレーションを適用する
最後に、コマンドラインで以下のコマンドを実行して変更を適用する。
$ python3 manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
Applying polls.0002_auto_20200128_0044... OK
一応SQL側で確認してみる。
mysql> DESC polls_question;
+---------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| question_text | varchar(200) | NO | | NULL | |
| pub_date | datetime(6) | NO | | NULL | |
+---------------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
ちゃんと変わってる
Django側の修正
model.pyなどのファイルを修正する。
変更前
model.py
class Question(models.Model):
question_text = models.CharField(max_length=200)
# pub_data -> pub_date
pub_data = models.DateTimeField('data published')
def __str__(self):
return self.question_text
変更後
model.py
class Question(models.Model):
question_text = models.CharField(max_length=200)
# pub_data -> pub_date
pub_date = models.DateTimeField('date published')
def __str__(self):
return self.question_text
おわり
カラム名を変更する関数名がRenameColumnじゃなくてRenameFieldなのってなんでなんでしょう・・・。
他に良い方法を知ってる方がいましたらご教示ください。