使用Django South将数据从一个模型迁移到另一个模型

时间:2011-10-24 14:17:55

标签: django migration data-migration django-south

我目前有一个需要重写的结构才能应对Django-CMS

目前设置如下

class Video(models.Model):        
    #embed_code_or_url = models.CharField(max_length=2000)
    permalink = models.URLField(verify_exists=True, unique=True, max_length=255, default="http://", validators=[validate_youtube_address])
    thumbnail = models.CharField(max_length=500, blank=True, null=True)
    # Data
    title = models.CharField(max_length=255, blank=True)
    ...

class VideoPlugin(CMSPlugin):
    video = models.ForeignKey(Video)

当我现在将所有字段从Video转移到VideoPlugin时,运行我的架构移植,我还想在运行迁移时将所有信息从Video传输到VideoPlugin。

有没有人举例说明如何实现这一目标?

以下是要运行的迁移的开始时间

class Migration(SchemaMigration):

    def forwards(self, orm):

        # Adding field 'VideoPlugin.permalink'
        db.add_column('cmsplugin_videoplugin', 'permalink', self.gf('django.db.models.fields.URLField')(default='http://', unique=True, max_length=255), keep_default=False)

        # Adding field 'VideoPlugin.thumbnail'
        db.add_column('cmsplugin_videoplugin', 'thumbnail', self.gf('django.db.models.fields.CharField')(max_length=500, null=True, blank=True), keep_default=False)

        # Adding field 'VideoPlugin.title'
        db.add_column('cmsplugin_videoplugin', 'title', self.gf('django.db.models.fields.CharField')(default='', max_length=255, blank=True), keep_default=False)

        ...

非常感谢您的帮助

1 个答案:

答案 0 :(得分:15)

您创建了一个数据迁移:

$ python manage.py datamigration yourapp name_of_this_migration

这会冻结您应用中的模型。如果迁移中涉及其他应用,则您需要向该行添加--freeze app1 --freeze app2等,以包含迁移中的那些应用。

这会为您设置基本迁移文件结构,但forwardsbackwards迁移为空。由您决定将数据从一个迁移到另一个的逻辑。但是除了你使用南ORM之外,这与Django中的其他任何东西都有效。对于此迁移所在的应用中的任何模型,您使用orm.MyModel.objects用于使用--freeze参数添加的任何其他应用,使用orm['someapp.SomeModel'].objects

除此之外,您只需获取/过滤/创建等对象,正常情况下将数据从一个移动到另一个。显然,您的转发迁移需要将数据移动到您现在所需的逻辑,并且您的向后迁移应该具有将数据恢复到原来所需的逻辑。

然后,您可以在开发环境中向前和向后迁移,以确保其正常运行。一个重要的注意事项:这仅用于移动数据。请勿更改或删除数据迁移中的任何表格结构。如果需要在移动数据后删除表。 数据迁移后创建一个schemamigration