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 Foo
model karena namanya tidak benar-benar masuk akal dan menyebabkan kebingungan dalam kode, dan Bar
akan 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 AnotherModel
nama bidang untuk foo
tidak berubah, tetapi relasi diperbarui ke Bar
model. Alasan saya adalah bahwa saya tidak boleh mengubah terlalu banyak sekaligus dan bahwa jika saya mengubah nama bidang ini menjadi bar
risiko kehilangan data di kolom itu.
Langkah 2
Buat migrasi kosong:
python manage.py makemigrations --empty myapp
Langkah 3
Edit Migration
kelas dalam file migrasi yang dibuat pada langkah 2 untuk menambahkan RenameModel
operasi 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 Migration
kelas dalam file migrasi yang dibuat pada langkah 6 untuk menambahkan RenameField
operasi 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!