在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
命令的第二秒钟在生产服务器上运行。
答案 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重命名为性别