使用Django South从具体继承转移到抽象继承

Spi*_*ike 10 python migration django django-south

我有一个现有的Django项目,它有几个使用基类的具体继承的模型.在仔细考虑之后,在阅读了像雅各布·卡普兰 - 莫斯这样的人对此有所说明后,在我的案例中使用这种具体的继承是不必要的.我想迁移到使用抽象基类.

使这个变得复杂的是我的网站是实时的,我有用户输入的数据.因此,在整个转换过程中,我需要保持所有数据的完整性.

我举一个更具体的例子:

之前:

APP1/models.py:

class Model1(base_app.models.BaseModel):
    field1 = models.CharField(max_length=1000)
    field2 = models.CharField(max_length=1000)
Run Code Online (Sandbox Code Playgroud)

APP 2/models.py:

class Model2(base_app.models.BaseModel):
    field1 = models.CharField(max_length=1000)
    field2 = models.CharField(max_length=1000)
Run Code Online (Sandbox Code Playgroud)

base_app/models.py:

class BaseModel(models.Model):
    user = models.ForeignKey(User)
    another_field = models.CharField(max_length=1000)
Run Code Online (Sandbox Code Playgroud)

后:

APP1/models.py:

class Model1(base_app.models.BaseModel):
    field1 = models.CharField(max_length=1000)
    field2 = models.CharField(max_length=1000)
Run Code Online (Sandbox Code Playgroud)

APP 2/models.py:

class Model2(base_app.models.BaseModel):
    field1 = models.CharField(max_length=1000)
    field2 = models.CharField(max_length=1000)
Run Code Online (Sandbox Code Playgroud)

base_app/models.py:

class BaseModel(models.Model):
    user = models.ForeignKey(User)
    another_field = models.CharField(max_length=1000)

    class Meta:
        abstract = True
Run Code Online (Sandbox Code Playgroud)

现在,我的计划是首先添加abstract = True到BaseModel.然后,对于每个使用的模型BaseModel,一次一个:

  • 使用south迁移数据库并使用--auto标志创建此迁移
  • 使用南数据迁移.例如,我将循环遍历Model1中的每个对象,以获取具有相同pk的BaseModel中的对象,并将BaseModel对象的每个字段的值复制到Model1对象.

首先,这会有用吗?第二,有更好的方法吗?

更新:

我的最终解决方案在这里详细描述:

http://www.markliu.me/2011/aug/23/migrating-a-django-postgres-db-from-concrete-inhe/

Seb*_*Seb 7

  1. 添加NewBaseModel,我们使用不同的名称,因此它不会与当前的非抽象名称冲突(南方实际上会删除BaseModel).

    class NewBaseModel(models.Model):
        user = models.ForeignKey(User)
        another_field = models.CharField(max_length=1000)
    
        class Meta:
            abstract = True
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将Model1和Model2设置为从NewBaseModel继承

  3. 运行schemamigration --auto,将向Model1和Model2添加2个新字段
  4. 运行datamigration --empty并从BaseModel中的值填充新字段
  5. 加载生产db并仔细检查所有迁移的内容
  6. 删除BaseModel并将NewBaseModel重命名为BaseModel
  7. 运行schemamigration --auto(这应该工作;))
  8. 部署!

注意:迁移时使用orm变量以使用模型模式的当前状态.

  • 刚刚意识到我的链接被破坏了.这是新的:http://www.markliu.me/2011/aug/23/migrating-a-django-postgres-db-from-concrete-inhe/ (2认同)