在南方,我可以将旧列的值复制到新列吗?

时间:2011-08-02 19:44:38

标签: python django django-models django-south

我的一个Django模型是一个子类,我想将其超类更改为与原始类非常相似的类。特别是,新的超类描述了相同的对象并具有相同的主键。如何让South创建新的OneToOne字段并将值从旧字段复制到新字段?

1 个答案:

答案 0 :(得分:11)

在南方,有两种迁移:架构迁移和数据迁移。

创建模式迁移后,创建相应的数据迁移:

./manage.py datamigration <app> <migration_name>

不要运行迁移(尚未)。而是打开刚刚创建的迁移文件。

您将找到名为forwards()的方法。在此定义将旧表中的值复制到新表的过程。

如果要将给定表的结构更改为更复杂的布局,常见的方法是围绕数据迁移进行两次架构迁移:第一次架构迁移添加字段,数据迁移将旧字段转换为新字段,第二个架构迁移删除旧字段。只要您跟踪您正在访问的模式(先前或当前),您就可以使用forwards()方法对数据库执行任何操作。通常,您只阅读与orm.相关的内容,并写入传统的Django访问器。

South Data Migration Tutorial详细介绍了这一点。它向您展示了如何使用South的orm引用在模式迁移之前使用模式访问数据库,并允许访问数据库,而Django不会抱怨它不理解的字段。

如果要重命名一个类,那可能会很棘手 - 它涉及创建新表,从一个表迁移到另一个表,以及删除旧表。 South可以做到这一点,但通过移动模式和数据迁移可能需要不止一次。

South还有backwards()方法,它允许您将数据库表返回到上一步。在某些情况下,这可能是不可能的;新表可能会记录在降级时丢失的信息。如果您未处于DEBUG模式,我建议您在backwards()中使用抛出异常。