Sto programmando di rinominare diversi modelli in un progetto Django esistente in cui ci sono molti altri modelli che hanno relazioni di chiave esterna con i modelli che vorrei rinominare. Sono abbastanza sicuro che ciò richiederà più migrazioni, ma non sono sicuro della procedura esatta.
Diciamo che inizio con i seguenti modelli all'interno di un'app Django chiamata 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()
Voglio rinominare il Foo
modello perché il nome non ha davvero senso e sta causando confusione nel codice e Bar
renderebbe un nome molto più chiaro.
Da quanto ho letto nella documentazione di sviluppo di Django, presumo la seguente strategia di migrazione:
Passo 1
Modifica 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()
Si noti che il AnotherModel
nome del campo per foo
non cambia, ma la relazione viene aggiornata al Bar
modello. Il mio ragionamento è che non dovrei cambiare troppo in una volta e che se cambiassi questo nome di campo bar
rischierei di perdere i dati in quella colonna.
Passo 2
Crea una migrazione vuota:
python manage.py makemigrations --empty myapp
Passaggio 3
Modificare la Migration
classe nel file di migrazione creato nel passaggio 2 per aggiungere RenameModel
l'operazione all'elenco delle operazioni:
class Migration(migrations.Migration):
dependencies = [
('myapp', '0001_initial'),
]
operations = [
migrations.RenameModel('Foo', 'Bar')
]
Passaggio 4
Applica la migrazione:
python manage.py migrate
Passaggio 5
Modifica i nomi dei campi correlati 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()
Passaggio 6
Crea un'altra migrazione vuota:
python manage.py makemigrations --empty myapp
Passaggio 7
Modificare la Migration
classe nel file di migrazione creato nel passaggio 6 per aggiungere le RenameField
operazioni per i nomi di campi correlati all'elenco delle operazioni:
class Migration(migrations.Migration):
dependencies = [
('myapp', '0002_rename_fields'), # <-- is this okay?
]
operations = [
migrations.RenameField('AnotherModel', 'foo', 'bar'),
migrations.RenameField('YetAnotherModel', 'foo', 'bar')
]
Passaggio 8
Applica la seconda migrazione:
python manage.py migrate
Oltre ad aggiornare il resto del codice (viste, moduli, ecc.) Per riflettere i nuovi nomi delle variabili, è sostanzialmente questo il modo in cui funzionerebbe la nuova funzionalità di migrazione?
Inoltre, questo sembra un sacco di passaggi. Le operazioni di migrazione possono essere condensate in qualche modo?
Grazie!