Django Docs使用此示例演示多表继承:
from django.db import models
class Place(models.Model):
name = models.CharField(max_length=50)
address = models.CharField(max_length=80)
class Restaurant(Place):
serves_hot_dogs = models.BooleanField(default=False)
serves_pizza = models.BooleanField(default=False)
如果我最初建造了这样的餐厅课程:
class Restaurant(models.Model):
name = models.CharField(max_length=50)
address = models.CharField(max_length=80)
serves_hot_dogs = models.BooleanField(default=False)
serves_pizza = models.BooleanField(default=False)
然后在创建了一堆Restaurant对象之后,我意识到使用MTI会更好,有没有一种好方法可以在事后创建父Place类并迁移数据?
答案 0 :(得分:2)
简单方法:在子模型中创建名为IntegerField
的假<parent_model>_ptr
,填充它,然后将其删除并同时添加父模型。
这是一篇完整的文章:http://www.johnborwick.com/blog/2013/08/using-south-to-change-a-django-models-parent-class/。这是关于南方的,但这个想法也适用于现代的Django。
答案 1 :(得分:1)
添加新模型,但也保留旧模型。 进行迁移。
撰写自定义迁移,将数据从Restaurant
模型复制到NewRestaurant
模型。
如有必要,请将其他模型中的任何外键字段从Restaurant
更改为NewRestaurant
,进行迁移。
如有必要,请在应用中随处更改使用Restaurant
类来使用NewRestaurant
类。
删除旧餐厅模型并进行迁移。
将新餐厅模型重命名为Restaurant
,以便所有内容都可以使用新结构。 进行迁移。