use*_*706 15 django django-south
我是从更改字段CharField
来IntegerField
.字段名称保持不变.新创建的字段将基于旧字段.例如,如果旧字段是"L",则它将具有数字"1".我怎样才能在forwards()
功能中实现这一目标?
Sim*_*tte 17
正确的方法是将其分解为三次迁移:
IntegerField
字段.CharField
为IntegerField
CharField
.如果您希望新添加IntegerField
的名称与要删除的名称相同,则可能需要第四个CharField
.
如果项目状态IntegerField
尚未添加到模型文件中,则应按照以下步骤继续:
IntegerField
到您的模型.datamigration
为包含模型的应用程序创建数据迁移(使用).在forwards()
新创建的DataMigration
类的方法中记下您的逻辑以转换您的数据.尝试使用update
manager方法,而不是在可能的情况下迭代所有数据库行.如果你使用dict
(比如{'L': 1, ...}
)声明你的转换逻辑,那么此时应该很容易实现backwards()
,因为操作是可逆的.这也是一个很好的练习,以确保你不会忽视一个简单的案例forwards()
- 它在过去帮助了我很多次.CharField
从模型中删除.DROP
现在使用未使用的列.将此操作分解为三次迁移而不是在空白模板中写下整个逻辑的事实具有以下几个优点:
ADD
/ DROP
逻辑已由South自动生成,您不必担心在数据库列中引入拼写错误.DataMigration.backwards()
转换步骤,您应该能够完全逆转整个操作.如果您需要回滚到代码的先前版本并且在更新生产代码库时作为安全网络,这对于测试目的而言非常方便.forwards()
本例中采用相同的方法),并且在数据迁移步骤期间引发了异常(例如,KeyError
因为转换中的未处理值dict
).如果您使用的ORDBMS
是不支持事务模式更改的服务器,那么在修复数据迁移部件后,您将无法立即重新运行迁移,您必须自己手动删除新添加的IntegerField
列.同样,这是迁移生产数据库时不想处理的事情. 归档时间: |
|
查看次数: |
4722 次 |
最近记录: |