Python 如何在不丢失任何数据的情况下完全更改Django数据库模式?

Python 如何在不丢失任何数据的情况下完全更改Django数据库模式?,python,django,django-models,django-migrations,Python,Django,Django Models,Django Migrations,我正在对数据库的模式进行一些重大更改,但我不想在迁移到新模式的过程中丢失任何数据。让我举一个具体的例子。我目前有一个类Person(models.Model),每个Person实例都有一组与之关联的数据,比如名称,年龄,等等。我的数据库中已经有很多Person实例。我现在意识到我实际上需要两种类型的人,一种是学生,一种是教师,每种类型都有自己独特的变量和方法。在我看来,实现这一点的最佳方法是将人设置为抽象类,并将学生和教师扩展该类。Person中的一些变量当前仅适用于Student,因此我想将这

我正在对数据库的模式进行一些重大更改,但我不想在迁移到新模式的过程中丢失任何数据。让我举一个具体的例子。我目前有一个
类Person(models.Model)
,每个
Person
实例都有一组与之关联的数据,比如
名称
年龄
,等等。我的数据库中已经有很多
Person
实例。我现在意识到我实际上需要两种类型的
,一种是
学生
,一种是
教师
,每种类型都有自己独特的变量和方法。在我看来,实现这一点的最佳方法是将
设置为抽象类,并将
学生
教师
扩展该类。
Person
中的一些变量当前仅适用于
Student
,因此我想将这些变量移动到
Student
子类中


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

您正在寻找的是Django

  • 向您的个人元模型添加
    abstract=True
  • 添加您的
    学生
    教师
    模型,并让它们继承自
    个人
  • 运行
    manage.py makemigrations
  • 由此产生的迁移将包含添加新模型和删除
    人员的操作。您的自定义数据迁移操作需要在创建之后和删除之前进行。遵循Django docs示例,该示例迁移了
    Person
    模型上的name字段,但为每个人创建新的
    Student
    Teacher
    模型的实例。请确保保存新实例
  • 其他提示:

  • 用于备份数据,以便轻松恢复 如果您在迁移过程中出错,它将被禁用
  • 明智的做法是重新命名新的特殊迁移,以便将来更容易识别

  • 你要找的是Django

  • 向您的个人元模型添加
    abstract=True
  • 添加您的
    学生
    教师
    模型,并让它们继承自
    个人
  • 运行
    manage.py makemigrations
  • 由此产生的迁移将包含添加新模型和删除
    人员的操作。您的自定义数据迁移操作需要在创建之后和删除之前进行。遵循Django docs示例,该示例迁移了
    Person
    模型上的name字段,但为每个人创建新的
    Student
    Teacher
    模型的实例。请确保保存新实例
  • 其他提示:

  • 用于备份数据,以便轻松恢复 如果您在迁移过程中出错,它将被禁用
  • 明智的做法是重新命名新的特殊迁移,以便将来更容易识别

  • 您还可以添加带有选项的person_type字段。这种方法的问题是,我想做的事情实际上有助于子类化,因为
    Student
    Teacher
    都有各自独立的变量和方法,但也有许多共享变量。
    教师
    有GPA是没有意义的,但是
    学生
    教师
    都有姓氏。这只是一个例子。如果您使用postgres,您可以探索使用hstorefield在字段中实现某种程度的灵活性。您还可以添加带有选项的person_类型字段。这种方法的问题是,我想做的事情实际上有助于子类化,因为
    Student
    Teacher
    都有各自独立的变量和方法,但也有许多共享变量。
    教师
    有GPA是没有意义的,但是
    学生
    教师
    都有姓氏。这只是一个例子。如果您使用postgres,您可以探索使用hstorefield在字段中实现某种程度的灵活性。