Ich plane, mehrere Modelle in einem vorhandenen Django-Projekt umzubenennen, in dem es viele andere Modelle gibt, die Fremdschlüsselbeziehungen zu den Modellen haben, die ich umbenennen möchte. Ich bin mir ziemlich sicher, dass dies mehrere Migrationen erfordert, bin mir aber nicht sicher, wie genau das vorgehen soll.
Angenommen, ich beginne mit den folgenden Modellen in einer Django-App namens 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()
Ich möchte das Foo
Modell umbenennen , da der Name nicht wirklich sinnvoll ist und Verwirrung im Code verursacht und Bar
zu einem viel klareren Namen führen würde.
Nach dem, was ich in der Django-Entwicklungsdokumentation gelesen habe, gehe ich von der folgenden Migrationsstrategie aus:
Schritt 1
Ändern 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()
Beachten Sie, dass sich der AnotherModel
Feldname für foo
nicht ändert, die Beziehung zum Bar
Modell jedoch aktualisiert wird . Meine Argumentation ist, dass ich nicht zu viel auf einmal ändern sollte und dass bar
ich das Risiko eingehen würde, die Daten in dieser Spalte zu verlieren , wenn ich diesen Feldnamen in ändere .
Schritt 2
Erstellen Sie eine leere Migration:
python manage.py makemigrations --empty myapp
Schritt 3
Bearbeiten Sie die Migration
Klasse in der in Schritt 2 erstellten Migrationsdatei, um die RenameModel
Operation zur Operationsliste hinzuzufügen :
class Migration(migrations.Migration):
dependencies = [
('myapp', '0001_initial'),
]
operations = [
migrations.RenameModel('Foo', 'Bar')
]
Schritt 4
Wenden Sie die Migration an:
python manage.py migrate
Schritt 5
Bearbeiten Sie die zugehörigen Feldnamen in 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()
Schritt 6
Erstellen Sie eine weitere leere Migration:
python manage.py makemigrations --empty myapp
Schritt 7
Bearbeiten Sie die Migration
Klasse in der in Schritt 6 erstellten Migrationsdatei, um die RenameField
Operation (en) für alle zugehörigen Feldnamen zur Operationsliste hinzuzufügen :
class Migration(migrations.Migration):
dependencies = [
('myapp', '0002_rename_fields'), # <-- is this okay?
]
operations = [
migrations.RenameField('AnotherModel', 'foo', 'bar'),
migrations.RenameField('YetAnotherModel', 'foo', 'bar')
]
Schritt 8
Wenden Sie die 2. Migration an:
python manage.py migrate
Abgesehen davon, dass der Rest des Codes (Ansichten, Formulare usw.) aktualisiert wird, um die neuen Variablennamen wiederzugeben, würde die neue Migrationsfunktionalität im Grunde so funktionieren?
Auch dies scheint eine Menge Schritte zu sein. Können die Migrationsvorgänge auf irgendeine Weise komprimiert werden?
Vielen Dank!