миграция изменения имени поля модели django без потери данных

У меня есть проект 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 ?

Каков наилучший способ сохранить данные в этом столбце при изменении имени столбца?

34
задан sfletche 16 August 2010 в 23:09
поделиться

1 ответ

Исправить довольно просто. Но вам придется изменить миграцию самостоятельно.

Вместо удаления и добавления столбца используйте db.rename_column . Вы можете просто изменить миграцию, созданную с помощью schemamigration --auto

17
ответ дан 27 November 2019 в 16:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: