2011-10-24 43 views
6

我目前有需要,以应付Django的CMS重写结构迁移数据的Django南

目前设置如下

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,运行我的schemamigration,我还想在运行迁移时将所有信息从Video转移到VideoPlugin。

有没有人有如何实现这个例子?

这里是移民的beginnig要运行

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) 

     ... 

你的帮助是非常赞赏

+0

可能的重复[如何将模型从一个django应用程序迁移到新的应用程序?](http://stackoverflow.com/questions/1258130/how-do-i-migrate-a-model- django-app-and-into-a-new-one) – dbn

回答

15

您创建一个datamigration:

$ python manage.py datamigration yourapp name_of_this_migration 

这冻结车型在您的应用程序。如果迁移中涉及其他应用程序,则需要将--freeze app1 --freeze app2等添加到该行中,以便将其包含在迁移中。

这为您设置了基本的迁移文件结构,但forwardsbackwards迁移为空。您需要确定将数据从一个数据迁移到另一个数据的逻辑。但是,这与Django中的其他任何功能一样,除了使用South ORM。对于您的应用程序中的此迁移所在的任何模型,您使用orm.MyModel.objects作为使用--freeze参数添加的任何其他应用程序,请使用orm['someapp.SomeModel'].objects

除此之外,你只需要/过滤/创建等,对象正常移动数据从一个到另一个。很明显,你的转发需要逻辑来移动你想要的数据,而你的后向迁移应该有将数据恢复到原来的位置所需的逻辑。

然后,您可以在开发环境中向前和向后迁移以确保其正常工作。一个重要的注意事项:这只是为了移动数据。请勿更改或删除数据迁移中的任何表结构。如果您需要在移动数据后删除表格。在之后创建一个模式迁移数据迁移。

+0

与Django 1.11及更高版本,您必须使用'python manage.py makemigrations --empty yourappname'来创建一个空的迁移文件 – Laky