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在字段中实现某种程度的灵活性。