Planuję zmienić nazwy kilku modeli w istniejącym projekcie Django, w którym istnieje wiele innych modeli, które mają relacje klucza obcego z modelami, które chciałbym zmienić. Jestem prawie pewien, że będzie to wymagało wielu migracji, ale nie jestem pewien dokładnej procedury.
Powiedzmy, że zacznę od następujących modeli w aplikacji Django o nazwie 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()
Chcę zmienić nazwę Foo
modelu, ponieważ nazwa tak naprawdę nie ma sensu i powoduje zamieszanie w kodzie i Bar
sprawiłaby, że nazwa byłaby znacznie jaśniejsza.
Z tego, co przeczytałem w dokumentacji deweloperskiej Django, przyjmuję następującą strategię migracji:
Krok 1
Modyfikuj 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()
Zwróć uwagę, że AnotherModel
nazwa pola foo
nie zmienia się, ale relacja jest aktualizowana doBar
modelu. Moje rozumowanie jest takie, że nie powinienem zmieniać zbyt wiele na raz i że gdybym zmienił nazwę tego pola na bar
, ryzykowałbym utratę danych w tej kolumnie.
Krok 2
Utwórz pustą migrację:
python manage.py makemigrations --empty myapp
Krok 3
Edytuj Migration
klasę w pliku migracji utworzonym w kroku 2, aby dodać RenameModel
operację do listy operacji:
class Migration(migrations.Migration):
dependencies = [
('myapp', '0001_initial'),
]
operations = [
migrations.RenameModel('Foo', 'Bar')
]
Krok 4
Zastosuj migrację:
python manage.py migrate
Krok 5
Edytuj powiązane nazwy pól w 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()
Krok 6
Utwórz kolejną pustą migrację:
python manage.py makemigrations --empty myapp
Krok 7
Edytuj Migration
klasę w pliku migracji utworzonym w kroku 6, aby dodać RenameField
operację (e) dla wszystkich powiązanych nazw pól do listy operacji:
class Migration(migrations.Migration):
dependencies = [
('myapp', '0002_rename_fields'), # <-- is this okay?
]
operations = [
migrations.RenameField('AnotherModel', 'foo', 'bar'),
migrations.RenameField('YetAnotherModel', 'foo', 'bar')
]
Krok 8
Zastosuj drugą migrację:
python manage.py migrate
Oprócz aktualizacji reszty kodu (widoków, formularzy itp.) W celu odzwierciedlenia nowych nazw zmiennych, czy w zasadzie tak będzie działać nowa funkcja migracji?
Wydaje się również, że jest to wiele kroków. Czy można w jakiś sposób skondensować operacje migracyjne?
Dzięki!