我要将一个字段从CharField
改为IntegerField
,字段名称保持不变。新创建的字段将基于旧字段。例如,如果旧字段是“L”,那么它将有数字“1”。我该如何在forwards()
函数中完成这个操作?
我要将一个字段从CharField
改为IntegerField
,字段名称保持不变。新创建的字段将基于旧字段。例如,如果旧字段是“L”,那么它将有数字“1”。我该如何在forwards()
函数中完成这个操作?
IntegerField
字段。CharField
的数据转换为IntegerField
CharField
。如果您希望您新添加的IntegerField
与即将删除的CharField
具有相同的名称,则可能需要第四个迁移。
假设在您的模型文件中尚未添加IntegerField
,则应按以下步骤进行操作:
IntegerField
。datamigration
)。 在新创建的DataMigration
类的forwards()
方法中编写转换数据的逻辑。请尽可能使用update
管理器方法,而不是迭代所有数据库行。如果您使用字典(例如{'L': 1, ...}
)声明您的转换逻辑,则在此时实现backwards()
也相当容易,因为该操作是可逆的。在forwards()
中确保您没有忽略任何特殊情况,这对我过去帮助很大。CharField
。DROP
现在未使用的列。将此操作分为三个迁移而不是在空白模板中编写整个逻辑有几个优点:
ADD
/DROP
逻辑已由South自动生成,您无需担心在数据库列中引入错别字。DataMigration.backwards()
用于转换步骤,那么您应该能够完全撤销整个操作。如果需要回滚到代码先前版本进行测试,或者在更新生产代码库时作为安全措施,这非常方便。forwards()
方法),并且在数据迁移步骤期间发生异常(例如由于转换dict
中的未处理值而导致的KeyError
)。如果您正在使用不支持事务模式的ORDBMS架构更改,则不能立即在修复数据迁移部分后重新运行您的迁移,您必须手动删除新添加的IntegerField
列。在迁移生产数据库时,您不希望遇到这样的问题。对于相同的情况,我只需要跟随3个步骤。
1)将文件类型从CharField更改为IntegerField,
2)ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (col_name::integer); 或者
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (trim(col_name)::integer); # 如果您的Char或Text字段中有空格,并且如果您的表中有数据,这些数据应该是整数字符串。
3)现在应用迁移。