2011-10-24 134 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