修改模型后,在django中进行南数据迁移

时间:2013-01-14 13:19:27

标签: django django-south

我有一个项目,现有的班级模型为

class Disability(models.Model):
    child = models.ForeignKey(Child,verbose_name=_("Child"))

但是随着最近的架构变更,我必须将其修改为

class Disability(models.Model):
    child = models.ManyToManyField(Child,verbose_name=_("Child"))

现在为这个新的改变..(甚至我必须修改新的现有数据库) 我想数据迁移是最好的方法,而不是手动完成。

我提到了这个在线文档

http://south.readthedocs.org/en/latest/commands.html#commands-datamigration

但它对数据迁移的关注度很低。以及有关模式迁移的更多信息。

问题1。如果我进行模式迁移,这将使我放弃所有属于旧模型的先前数据。

问题2。即使我想进行架构迁移,也要问这个......

 (rats)rats@Inspiron:~/profoundis/kenyakids$ ./manage.py schemamigration web --auto 
  ? The field 'Disability.child' does not have a default specified, yet is NOT NULL.
  ? Since you are removing this field, you MUST specify a default
  ? value to use for existing rows. Would you like to:
  ?  1. Quit now, and add a default to the field in models.py
  ?  2. Specify a one-off value to use for existing columns now
  ?  3. Disable the backwards migration by raising an exception.
  ? Please select a choice: 1

任何人都可以解释架构和数据迁移之间的概念和区别,以及如何单独实现这一点。

2 个答案:

答案 0 :(得分:3)

架构和数据迁移不是用于修改表结构的不同选项。它们是完全不同的东西。当然,数据迁移是fully described in the South docs

此处数据迁移对您没有帮助,因为您需要修改架构。南方和其他迁移系统的重点在于它们允许您在不丢失数据的情况下执行此操作。

答案 1 :(得分:1)

  1. South将尝试通过将表数据移动到临时表(我可能在那里错误)来执行事务,然后重组表并尝试将原始数据添加到新结构。像这样:
  2. old_table - >克隆 - > tmp_table的

    old_table - >重组

    tmp_table.data - >表

    南方将查看字段类型。如果发生重大变化,它会询问该怎么做。例如,将文本字段转换为int字段将很难转换:)

    1. 删除字段时,您可能仍希望能够转换回旧结构,因此南方需要一些默认数据才能创建具有旧结构的表。
    2. 移动数据始终是一个问题,因为您可能会更改表结构和字段类型。例如,如何手动处理Char(max_length = 100)到Char(max_length = 50)的数据?

      最好的建议是保持良好的备份。 还可以利用djangos灯具。您可以保存不同数据结构的夹具以及南迁移。

        

      South将以与syncdb相同的方式加载initial_data文件,但它   在每个成功的迁移过程结束时加载它们

      http://south.readthedocs.org/en/latest/commands.html#initial-data-and-post-syncdb