Я планую перейменувати кілька моделей у існуючому проекті Django, де є багато інших моделей, які мають зовнішні ключові стосунки до моделей, які я хотів би перейменувати. Я впевнений, що це потребуватиме багаторазових міграцій, але я не впевнений у точній процедурі.
Скажімо, я починаю з таких моделей у програмі Django під назвою 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
модель, тому що ім'я насправді не має сенсу і викликає плутанину в коді, і це Bar
означало б набагато чіткіше ім'я.
З того, що я прочитав у документації щодо розвитку Джанго, я припускаю таку міграційну стратегію:
Крок 1
Змінити 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()
Зверніть увагу, що AnotherModel
назва поля foo
не змінюється, але відношення оновлено до Bar
моделі. Мої міркування полягають у тому, що я не повинен занадто сильно змінюватись одразу, і якщо я змінив це ім'я поля, bar
то ризикнув би втратити дані у цьому стовпці.
Крок 2
Створіть порожню міграцію:
python manage.py makemigrations --empty myapp
Крок 3
Відредагуйте Migration
клас у файлі міграції, створеному на кроці 2, щоб додати RenameModel
операцію до списку операцій:
class Migration(migrations.Migration):
dependencies = [
('myapp', '0001_initial'),
]
operations = [
migrations.RenameModel('Foo', 'Bar')
]
Крок 4
Застосувати міграцію:
python manage.py migrate
Крок 5
Редагуйте пов’язані імена полів у 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
Створіть ще одну порожню міграцію:
python manage.py makemigrations --empty myapp
Крок 7
Відредагуйте Migration
клас у файлі міграції, створеному на кроці 6, щоб додати RenameField
операції (и) для будь-яких пов'язаних імен полів до списку операцій:
class Migration(migrations.Migration):
dependencies = [
('myapp', '0002_rename_fields'), # <-- is this okay?
]
operations = [
migrations.RenameField('AnotherModel', 'foo', 'bar'),
migrations.RenameField('YetAnotherModel', 'foo', 'bar')
]
Крок 8
Застосувати другу міграцію:
python manage.py migrate
Окрім того, не оновлюючи решту коду (перегляди, форми тощо), щоб відобразити нові імена змінних, це в основному, як працює нова функція міграції?
Також це здається безліччю кроків. Чи можна міграційними операціями якось стиснутись?
Дякую!