我怎样才能在不丢失任何数据的情况下完全改变我的 Django 数据库模式?
How can I completely alter my Django database schema without losing any data?
我正在对我的数据库架构进行一些重大更改,但我不想在迁移到新架构的过程中丢失任何数据。让我举一个具体的例子。我目前有一个 class Person(models.Model)
,每个 Person
实例都有一堆数据与之关联,例如 name
、age
等。已经有很多 Person
我的数据库中的实例。我现在意识到我实际上需要两种类型的 Person
,一种 Student
和一种 Teacher
,并且每种类型都有自己独特的变量和方法。在我看来,实现此目标的最佳方法是使 Person
成为抽象 class 并使 Student
和 Teacher
扩展 class。 Person
中的一些变量目前仅适用于 Student
,所以我想将这些变量移动到 Student
subclass.
一般来说,我怎样才能在不丢失任何数据的情况下进行此迁移?我是 Django 的新手,所以我真的不知道从哪里开始,除了我可能需要编写某种自定义脚本以 运行 和 python manage.py
.
您要查找的是 Django data migrations。
- 将
abstract = True
添加到您的人物元模型
- 添加您的
Student
和 Teacher
模型并让它们继承自 Person
- 运行
manage.py makemigrations
- 由此产生的迁移将包含添加新模型和删除
Person
的操作。您的自定义数据迁移操作需要在创建之后和删除之前进行。按照迁移 Person
模型上的名称字段的 Django 文档示例,而是为每个人创建新的 Student
和 Teacher
模型的实例。请务必保存新实例。
其他提示:
- 使用fixtures备份您的数据,以便您轻松恢复
万一您在迁移过程中犯了错误
- 最好重新命名您的新特殊迁移,以便您将来更容易识别它
我正在对我的数据库架构进行一些重大更改,但我不想在迁移到新架构的过程中丢失任何数据。让我举一个具体的例子。我目前有一个 class Person(models.Model)
,每个 Person
实例都有一堆数据与之关联,例如 name
、age
等。已经有很多 Person
我的数据库中的实例。我现在意识到我实际上需要两种类型的 Person
,一种 Student
和一种 Teacher
,并且每种类型都有自己独特的变量和方法。在我看来,实现此目标的最佳方法是使 Person
成为抽象 class 并使 Student
和 Teacher
扩展 class。 Person
中的一些变量目前仅适用于 Student
,所以我想将这些变量移动到 Student
subclass.
一般来说,我怎样才能在不丢失任何数据的情况下进行此迁移?我是 Django 的新手,所以我真的不知道从哪里开始,除了我可能需要编写某种自定义脚本以 运行 和 python manage.py
.
您要查找的是 Django data migrations。
- 将
abstract = True
添加到您的人物元模型 - 添加您的
Student
和Teacher
模型并让它们继承自Person
- 运行
manage.py makemigrations
- 由此产生的迁移将包含添加新模型和删除
Person
的操作。您的自定义数据迁移操作需要在创建之后和删除之前进行。按照迁移Person
模型上的名称字段的 Django 文档示例,而是为每个人创建新的Student
和Teacher
模型的实例。请务必保存新实例。
其他提示:
- 使用fixtures备份您的数据,以便您轻松恢复 万一您在迁移过程中犯了错误
- 最好重新命名您的新特殊迁移,以便您将来更容易识别它