从具有选择的IntegerField迁移到CharField

时间:2020-02-18 15:14:52

标签: python django

在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)

如果我通过运行makemigrationsmigrate来做到这一点,我将丢失数据库中的现有数据。

在不丢失数据库中现有数据的情况下,如何进行此(和类似的)迁移?

理想情况下,我会在迁移本身中执行此操作,这样它将在我们使用migrate命令的第二秒钟在生产服务器上运行。

3 个答案:

答案 0 :(得分:2)

您需要进行数据迁移(正如我最近在此答案中概述的:How to modify a models who's already migrated in Database?),但是步骤是:

  • gender重命名为gender_integer(或类似名称);进行迁移
  • 添加新的gender字段;进行迁移
  • 创建数据迁移以将gender_integer的内容映射到gender(请参见上面的链接)
  • 删除gender_integer;进行迁移。

答案 1 :(得分:0)

首先,您可以存储旧字段,并使用新选择将新字段添加到模型中。之后,您可以运行独立代码并将旧数据映射到新字段。

答案 2 :(得分:0)

迁移1:创建一个诸如gender_tmp之类的char字段,并将所有数据迁移至其中

迁移2:删除性别并将性别_tmp重命名为性别

相关问题