将 Django 模型父 class 添加到现有模型以实现多 table 继承
Add Django model parent class to existing an existing model for multi-table inheritance
Django Docs使用这个例子来演示多table继承:
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:
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 class 并迁移数据?
添加新模型但同时保留旧模型。 进行迁移.
编写自定义迁移将数据从Restaurant
模型复制到NewRestaurant
模型。
如有必要,将其他模型中的任何外键字段从 Restaurant
更改为 NewRestaurant
并 进行迁移。
如有必要,将应用中的Restaurant
class改成NewRestaurant
class.
删除旧餐厅模型并进行迁移。
将新的餐厅模型重命名为 Restaurant
,这样一切都可以在新的结构下再次运行。 进行迁移.
简单方法:在子模型中创建名为 <parent_model>_ptr
的假 IntegerField
,填充它,然后删除它并同时添加父模型。
这是一篇完整的文章:http://www.johnborwick.com/blog/2013/08/using-south-to-change-a-django-models-parent-class/。它是关于南方的,但这个想法也适用于现代 Django。
Django Docs使用这个例子来演示多table继承:
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:
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 class 并迁移数据?
添加新模型但同时保留旧模型。 进行迁移.
编写自定义迁移将数据从
Restaurant
模型复制到NewRestaurant
模型。如有必要,将其他模型中的任何外键字段从
Restaurant
更改为NewRestaurant
并 进行迁移。如有必要,将应用中的
Restaurant
class改成NewRestaurant
class.删除旧餐厅模型并进行迁移。
将新的餐厅模型重命名为
Restaurant
,这样一切都可以在新的结构下再次运行。 进行迁移.
简单方法:在子模型中创建名为 <parent_model>_ptr
的假 IntegerField
,填充它,然后删除它并同时添加父模型。
这是一篇完整的文章:http://www.johnborwick.com/blog/2013/08/using-south-to-change-a-django-models-parent-class/。它是关于南方的,但这个想法也适用于现代 Django。