我有一个现有的 Django 项目,其中有几个使用基类的具体继承的模型。经过仔细考虑,并阅读了人们喜欢雅各布·卡普兰-莫斯的内容后不得不说一下,在我的例子中没有必要使用这个具体的继承。我想改为使用抽象基类。
使事情变得复杂的是我的网站是实时的并且我有用户输入的数据。因此,我需要在整个过渡过程中保持所有数据完好无损。
我举一个例子更具体:
Before:
app1/models.py:
class Model1(base_app.models.BaseModel):
field1 = models.CharField(max_length=1000)
field2 = models.CharField(max_length=1000)
app2/models.py:
class Model2(base_app.models.BaseModel):
field1 = models.CharField(max_length=1000)
field2 = models.CharField(max_length=1000)
base_app/models.py:
class BaseModel(models.Model):
user = models.ForeignKey(User)
another_field = models.CharField(max_length=1000)
After:
app1/models.py:
class Model1(base_app.models.BaseModel):
field1 = models.CharField(max_length=1000)
field2 = models.CharField(max_length=1000)
app2/models.py:
class Model2(base_app.models.BaseModel):
field1 = models.CharField(max_length=1000)
field2 = models.CharField(max_length=1000)
base_app/models.py:
class BaseModel(models.Model):
user = models.ForeignKey(User)
another_field = models.CharField(max_length=1000)
class Meta:
abstract = True
现在,我的计划是首先添加abstract = True
到基本模型。然后,对于每个使用的模型BaseModel
, 一次一个:
- 使用 South 迁移数据库并使用 --auto 标志创建此迁移
- 使用向南数据迁移。例如,我将循环访问 Model1 中的每个对象,以获取 BaseModel 中具有相同 pk 的对象,并将 BaseModel 对象的每个字段的值复制到 Model1 对象。
首先,这会起作用吗?其次,有没有更好的方法来做到这一点?
Update:
我的最终解决方案详细描述如下:
http://www.markliu.me/2011/aug/23/migration-a-django-postgres-db-from-concrete-inhe/