我的一个Django模型是一个子类,我想将其超类更改为与原始类非常相似的类。特别是,新的超类描述了相同的对象并具有相同的主键。如何让South创建新的OneToOne字段并将值从旧字段复制到新字段?
答案 0 :(得分:11)
在南方,有两种迁移:架构迁移和数据迁移。
创建模式迁移后,创建相应的数据迁移:
./manage.py datamigration <app> <migration_name>
不要运行迁移(尚未)。而是打开刚刚创建的迁移文件。
您将找到名为forwards()
的方法。在此定义将旧表中的值复制到新表的过程。
如果要将给定表的结构更改为更复杂的布局,常见的方法是围绕数据迁移进行两次架构迁移:第一次架构迁移添加字段,数据迁移将旧字段转换为新字段,第二个架构迁移删除旧字段。只要您跟踪您正在访问的模式(先前或当前),您就可以使用forwards()
方法对数据库执行任何操作。通常,您只阅读与orm.
相关的内容,并写入传统的Django访问器。
South Data Migration Tutorial详细介绍了这一点。它向您展示了如何使用South的orm
引用在模式迁移之前使用模式访问数据库,并允许访问数据库,而Django不会抱怨它不理解的字段。
如果要重命名一个类,那可能会很棘手 - 它涉及创建新表,从一个表迁移到另一个表,以及删除旧表。 South可以做到这一点,但通过移动模式和数据迁移可能需要不止一次。
South还有backwards()
方法,它允许您将数据库表返回到上一步。在某些情况下,这可能是不可能的;新表可能会记录在降级时丢失的信息。如果您未处于DEBUG模式,我建议您在backwards()
中使用抛出异常。