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