如何在不丢失任何数据的情况下彻底改变我的Django数据库模式?

时间:2017-05-09 17:06:19

标签: python django django-models django-migrations

我对数据库的架构进行了一些重大更改,但我不想在迁移到新架构的过程中丢失任何数据。让我举一个具体的例子。我目前有一个class Person(models.Model),每个Person实例都有一大堆与之关联的数据,例如nameage等。已经有很多Person我的数据库中的实例。我现在意识到我实际上需要两种Person,一种Student和一种Teacher,每种类型都有自己独特的变量和方法。在我看来,实现这一目标的最佳方法是使Person成为一个抽象类,并使StudentTeacher扩展该类。 Person中的一些变量目前仅适用于Student,因此我希望将这些变量移到Student子类中。

一般情况下,如何在不丢失任何数据的情况下进行此迁移?我对Django很新,所以我不知道从哪里开始,除了我可能需要编写某种自定义脚本以便与python manage.py一起运行。

1 个答案:

答案 0 :(得分:3)

您正在寻找的是Django data migrations

  1. abstract = True添加到您的元元模型
  2. 添加您的StudentTeacher模型并让它们继承自Person
  3. 运行manage.py makemigrations
  4. 生成的迁移将包含添加新模型并删除Person的操作。您的自定义数据迁移操作需要在创建之后和删除之前进行。按照Django文档示例迁移Person模型上的名称字段,而是为每个人创建新StudentTeacher模型的实例。请务必保存新实例。
  5. 其他提示:

    1. 使用fixtures备份您的数据,以便您轻松恢复 如果你在迁移过程中犯了错误
    2. 将您的新特殊迁移重命名,以便将来更容易识别
    3. 是明智的。