Миграция с IntegerField с выбором на CharField - PullRequest
0 голосов
/ 18 февраля 2020

В Django У меня есть модель со следующим IntegerField.

GENDER_CHOICES = (
    (0, 'Male'),
    (1, 'Female'),
)
gender = models.IntegerField(choices=GENDER_CHOICES)

Я бы хотел, чтобы эта модель стала CharField, используя варианты.

GENDER_CHOICES = (
    ("MALE", 'Male'),
    ("FEMALE", 'Female'),
    ("NA", 'Id Rather Not Say'),
)
gender = models.CharField(choices=GENDER_CHOICES, max_length=10)

Если Я должен был сделать это, запустив makemigrations и migrate Я бы потерял существующие данные в базе данных.

Как бы я сделал эту (и аналогичные) миграции, не потеряв существующие данные в базе данных?

В идеале я бы сделал это в самой миграции таким образом, чтобы она выполнялась на рабочем сервере, как только мы воспользуемся командой migrate.

Ответы [ 3 ]

2 голосов
/ 18 февраля 2020

Вам понадобится перенос данных (как я недавно обрисовал в этом ответе: Как изменить модели, уже перенесенные в базу данных? ), но шаги:

  • переименовать gender в gender_integer (или аналогичный); сделать миграцию из этого
  • добавить новое поле gender; выполнить миграцию из этого
  • создать миграцию данных для сопоставления содержимого gender_integer с gender (см. ссылку выше)
  • remove gender_integer; сделать миграцию из этого.
0 голосов
/ 18 февраля 2020

Миграция 1: создать поле типа char_tmp, перенести в него все данные

Миграция 2: удалить пол и переименовать пол_темпа в пол

0 голосов
/ 18 февраля 2020

Во-первых, вы можете сохранить старое поле и добавить новое поле вашей модели с новыми вариантами. После этого вы можете запустить автономный код и сопоставить ваши старые данные с новым полем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...