Yeniden adlandırmak istediğim modellerle yabancı anahtar ilişkileri olan birçok modelin bulunduğu mevcut bir Django projesinde birkaç modeli yeniden adlandırmayı planlıyorum. Bunun birden fazla taşıma gerektireceğinden oldukça eminim, ancak tam prosedürden emin değilim.
Diyelim ki bir Django uygulamasında aşağıdaki modellerle başlıyorum 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
Modeli gerçekten yeniden adlandırmak istiyorum çünkü isim gerçekten mantıklı değil ve kodda karışıklığa neden oluyor ve Bar
çok daha net bir isim için.
Django geliştirme belgelerinde okuduklarımdan, aşağıdaki taşıma stratejisini varsayıyorum:
Aşama 1
Değiştir 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()
İçin AnotherModel
alan adının foo
değişmediğini, ancak ilişkinin Bar
modele güncellendiğini unutmayın . Benim gerekçem, bir kerede çok fazla değişmemem ve bu alan adını olarak değiştirirsem bar
o sütundaki verileri kaybetme riskiyle karşı karşıya olduğum.
Adım 2
Boş bir taşıma oluşturun:
python manage.py makemigrations --empty myapp
Aşama 3
Düzenleme Migration
eklemek için 2. adımda oluşturduğunuz geçiş dosyasındaki sınıf RenameModel
operasyonlar listesine operasyonu:
class Migration(migrations.Migration):
dependencies = [
('myapp', '0001_initial'),
]
operations = [
migrations.RenameModel('Foo', 'Bar')
]
4. Adım
Taşıma işlemini uygulayın:
python manage.py migrate
Adım 5
İlgili alan adlarını şurada düzenleyin 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. Adım
Başka bir boş taşıma oluşturun:
python manage.py makemigrations --empty myapp
Adım 7
Düzenleme Migration
6. adımda oluşturulan geçiş dosyasındaki sınıf eklemek için RenameField
operasyon listesine ilgili herhangi alan adları için operasyon (ler):
class Migration(migrations.Migration):
dependencies = [
('myapp', '0002_rename_fields'), # <-- is this okay?
]
operations = [
migrations.RenameField('AnotherModel', 'foo', 'bar'),
migrations.RenameField('YetAnotherModel', 'foo', 'bar')
]
8. Adım
2. geçişi uygulayın:
python manage.py migrate
Kodun geri kalanını (görünümler, formlar, vb.) Yeni değişken adlarını yansıtacak şekilde güncellemenin yanı sıra, temel olarak yeni taşıma işlevselliği nasıl çalışır?
Ayrıca, bu birçok adım gibi görünüyor. Göç operasyonları bir şekilde yoğunlaştırılabilir mi?
Teşekkürler!