У меня есть проект django с таблицей базы данных, которая уже содержит данные. Я хотел бы изменить имя поля без потери каких-либо данных в этом столбце. Мой первоначальный план состоял в том, чтобы просто изменить имя поля модели таким образом, чтобы фактически не изменить имя таблицы базы данных (используя параметр столбца db_column
):
Исходная модель:
class Foo(models.Model):
orig_name = models.CharField(max_length=50)
новая модель:
class Foo(models.Model):
name = models.CharField(max_length=50, db_column='orig_name')
Но при запуске схемы Юга --auto
Юга создает скрипт миграции, который удаляет исходный столбец, orig_name
и добавляет новый столбец с именем name
, что может привести к нежелательному побочному эффекту удаления данных в этом столбце. (Меня также смущает, почему Саут хочет изменить имя столбца в БД, так как я понял, что db_column позволяет изменять имя поля модели без изменения имени столбца таблицы базы данных).
Если мне не удастся сойтись с изменением поля модели без изменения поля db, я думаю, я мог бы сделать более простое изменение имени, например, так:
Исходная модель:
class Foo(models.Model):
orig_name = models.CharField(max_length=50)
Новая модель:
class Foo(models.Model):
name = models.CharField(max_length=50)
Независимо от того, какую стратегию я в конечном итоге использовал (я бы предпочел первую, но я бы нашел вторую приемлемую), моя главная задача - не потерять данные, которые уже есть в этом столбце.
Требуется ли для этого многоэтапный процесс? (например, 1.
Или я могу изменить скрипт миграции с помощью чего-то вроде db.alter_column
?
Каков наилучший способ сохранить данные в этом столбце при изменении имени столбца?
Исправить довольно просто. Но вам придется изменить миграцию самостоятельно.
Вместо удаления и добавления столбца используйте db.rename_column
. Вы можете просто изменить миграцию, созданную с помощью schemamigration --auto