LoginSignup
17
13

More than 3 years have passed since last update.

Django3でテーブルのカラム(フィールド)名を変更する

Last updated at Posted at 2020-01-28

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)

ちゃんと変わってる:relaxed:

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なのってなんでなんでしょう・・・。

他に良い方法を知ってる方がいましたらご教示ください。

17
13
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
17
13