Saya berencana untuk mengganti nama beberapa model dalam proyek Django yang ada di mana ada banyak model lain yang memiliki hubungan kunci asing dengan model yang ingin saya ganti namanya. Saya cukup yakin ini akan membutuhkan banyak migrasi, tetapi saya tidak yakin prosedurnya.
Katakanlah saya mulai dengan model-model berikut dalam aplikasi Django bernama 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()
Saya ingin mengganti nama Foomodel karena namanya tidak benar-benar masuk akal dan menyebabkan kebingungan dalam kode, dan Barakan membuat nama yang jauh lebih jelas.
Dari apa yang saya baca dalam dokumentasi pengembangan Django, saya mengasumsikan strategi migrasi berikut:
Langkah 1
Ubah 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()
Perhatikan AnotherModelnama bidang untuk footidak berubah, tetapi relasi diperbarui ke Barmodel. Alasan saya adalah bahwa saya tidak boleh mengubah terlalu banyak sekaligus dan bahwa jika saya mengubah nama bidang ini menjadi barrisiko kehilangan data di kolom itu.
Langkah 2
Buat migrasi kosong:
python manage.py makemigrations --empty myapp
Langkah 3
Edit Migrationkelas dalam file migrasi yang dibuat pada langkah 2 untuk menambahkan RenameModeloperasi ke daftar operasi:
class Migration(migrations.Migration):
dependencies = [
('myapp', '0001_initial'),
]
operations = [
migrations.RenameModel('Foo', 'Bar')
]
Langkah 4
Terapkan migrasi:
python manage.py migrate
Langkah 5
Edit nama bidang terkait di 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()
Langkah 6
Buat migrasi kosong lain:
python manage.py makemigrations --empty myapp
Langkah 7
Edit Migrationkelas dalam file migrasi yang dibuat pada langkah 6 untuk menambahkan RenameFieldoperasi untuk nama bidang terkait ke daftar operasi:
class Migration(migrations.Migration):
dependencies = [
('myapp', '0002_rename_fields'), # <-- is this okay?
]
operations = [
migrations.RenameField('AnotherModel', 'foo', 'bar'),
migrations.RenameField('YetAnotherModel', 'foo', 'bar')
]
Langkah 8
Terapkan migrasi ke-2:
python manage.py migrate
Selain memperbarui sisa kode (tampilan, formulir, dll.) Untuk mencerminkan nama variabel baru, apakah ini pada dasarnya bagaimana fungsi migrasi baru akan bekerja?
Juga, ini sepertinya banyak langkah. Bisakah operasi migrasi dikondensasi dengan cara tertentu?
Terima kasih!