Я планирую переименовать несколько моделей в существующем проекте 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
может привести к более четкому названию.
Из того, что я прочитал в документации по разработке Django, я предполагаю следующую стратегию миграции:
Шаг 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
Примените 2-ю миграцию:
python manage.py migrate
Помимо обновления остальной части кода (представления, формы и т. Д.) Для отображения новых имен переменных, будет ли это в основном работать с новыми функциями миграции?
Кроме того, это кажется много шагов. Можно ли каким-то образом сократить миграционные операции?
Спасибо!