名前を変更したいモデルとの外部キー関係を持つ他の多くのモデルが存在する既存のDjangoプロジェクトで、いくつかのモデルの名前を変更することを計画しています。これには複数の移行が必要になると確信していますが、正確な手順はわかりません。
と呼ばれるDjangoアプリ内の次のモデルから始めるとしましょうmyapp
:
class Foo(models.Model):
name = models.CharField(unique=True, max_length=32)
description = models.TextField(null=True, blank=True)
class AnotherModel(models.Model):
foo = models.ForeignKey(Foo)
is_awesome = models.BooleanField()
class YetAnotherModel(models.Model):
foo = models.ForeignKey(Foo)
is_ridonkulous = models.BooleanField()
Foo
名前は実際には意味がなく、コードに混乱を引き起こしているため、モデルの名前を変更します。これにより、名前がBar
より明確になります。
Django開発ドキュメントで読んだことから、次の移行戦略を想定しています。
ステップ1
変更models.py
:
class Bar(models.Model): # <-- changed model name
name = models.CharField(unique=True, max_length=32)
description = models.TextField(null=True, blank=True)
class AnotherModel(models.Model):
foo = models.ForeignKey(Bar) # <-- changed relation, but not field name
is_awesome = models.BooleanField()
class YetAnotherModel(models.Model):
foo = models.ForeignKey(Bar) # <-- changed relation, but not field name
is_ridonkulous = models.BooleanField()
のAnotherModel
フィールド名foo
は変更されませんが、リレーションがBar
モデルに更新されます。私の考えでは、一度にあまり変更しないでください。このフィールド名をbar
に変更すると、その列のデータが失われる危険性があります。
ステップ2
空のマイグレーションを作成します。
python manage.py makemigrations --empty myapp
ステップ3
Migration
手順2で作成した移行ファイルのクラスを編集して、RenameModel
操作を操作リストに追加します。
class Migration(migrations.Migration):
dependencies = [
('myapp', '0001_initial'),
]
operations = [
migrations.RenameModel('Foo', 'Bar')
]
ステップ4
移行を適用します。
python manage.py migrate
手順5
で関連するフィールド名を編集しますmodels.py
。
class Bar(models.Model):
name = models.CharField(unique=True, max_length=32)
description = models.TextField(null=True, blank=True)
class AnotherModel(models.Model):
bar = models.ForeignKey(Bar) # <-- changed field name
is_awesome = models.BooleanField()
class YetAnotherModel(models.Model):
bar = models.ForeignKey(Bar) # <-- changed field name
is_ridonkulous = models.BooleanField()
手順6
別の空の移行を作成します。
python manage.py makemigrations --empty myapp
手順7
Migration
手順6で作成した移行ファイルのクラスを編集して、RenameField
関連するフィールド名の操作を操作リストに追加します。
class Migration(migrations.Migration):
dependencies = [
('myapp', '0002_rename_fields'), # <-- is this okay?
]
operations = [
migrations.RenameField('AnotherModel', 'foo', 'bar'),
migrations.RenameField('YetAnotherModel', 'foo', 'bar')
]
手順8
2番目の移行を適用します。
python manage.py migrate
新しい変数名を反映するように残りのコード(ビュー、フォームなど)を更新する以外に、これは基本的に新しい移行機能がどのように機能するのでしょうか?
また、これは多くのステップのようです。移行操作を何らかの方法で凝縮できますか?
ありがとう!