使用south将数据迁移到不起作用的新模型

时间:2012-02-01 16:08:56

标签: django data-migration django-south

我有一个抽象模型,我正在转换为具体模型。我成功使用south来更改架构,但我无法使用数据迁移。

我的初始状态是:

class UserProfile(models.Model):
    user = models.OneToOneField(User, primary_key=True, \
                                related_name='profile')
    class Meta:
        abstract=True
class SpecificProfile(UserProfile):
    url = models.URLField()

我的新州是:

class UserProfile(models.Model):
    user = models.OneToOneField(User, primary_key=True, \
                                related_name='profile')
class SpecificProfile(UserProfile):
    user_profile = models.OneToOneField(UserProfile, parent_link=True)
    url = models.URLField()

我的架构迁移是:

class Migration(SchemaMigration):

    def forwards(self, orm):
        # Renaming field 'SpecProfile.user_profile'
        db.rename_column('specificprofile', 'user_id', 'user_profile_id')

        # Adding model 'UserProfile'
        db.create_table('userprofile', (
            ('user', self.gf('django.db.models.fields.related.OneToOneField')(related_name='profile', unique=True, primary_key=True, to=orm['auth.User'])),
        ))
        db.send_create_signal('myapp', ['UserProfile'])

我编辑了south生成的文件,以便在SpecificProfile中重命名一个字段

现在,在数据迁移过程中,我想为每个SpecificProfile创建一个UserProfile条目,并将UserProfile.user_id分配给SpecificProfile.user_profile_id

因此,我的数据迁移前提是:

class Migration(DataMigration):

    def forwards(self, orm):
        for spec in orm.SpecificProfile.objects.all():
            user_profile = orm.UserProfile()
            user_profile.user_id = spec.user_profile_id
            user_profile.save()

脚本运行时没有错误,但不会在UserProfile表中创建任何新条目。 我应该使用UserProfile()代替orm.UserProfile()吗?

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

之前不存在

SpecificProfile.user_profile_id,因此无法迁移数据。您真正想要做的是将user_profile.user设置为spec.user,然后将spec.user_profile设置为user_profile

 def forwards(self, orm):
    for spec in orm.SpecificProfile.objects.all():
        user_profile = orm.UserProfile()
        user_profile.user_id = spec.user_id
        user_profile.save()

        # Then,
        spec.user_profile_id = user_profile.id

但是,一旦完成初始迁移,我很确定SpecificProfile.user不再存在。 South删除该字段,因为它现在位于UserProfile