2011-10-24 9 views
6

Al momento ho una struttura che deve essere riscritto in modo da far fronte con Django-CMSMigrazione dei dati da un modello ad un altro con Django Sud

Attualmente la configurazione è la seguente

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) 

quando ho ora trasferire tutti i miei campi da Video a VideoPlugin, eseguire la mia schemamigration, mi piacerebbe anche trasferire TUTTE le informazioni da Video a VideoPlugin quando eseguo la migrazione.

Qualcuno ha un esempio su come questo può essere raggiunto?

Ecco la beginnig della migrazione da eseguire

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) 

     ... 

Il vostro aiuto è molto apprezzato

+0

possibile duplicato di [Come faccio a migrare un modello da un'app django a uno nuovo?] (Http://stackoverflow.com/questions/1258130/how-do-i-migrate-a-model- out-of-one-django-app-and-in-new-one) – dbn

risposta

15

Si crea un datamigration:

$ python manage.py datamigration yourapp name_of_this_migration 

Questo congela i modelli nella vostra applicazione. Se un'altra/e altra/e app è/sono coinvolta nella migrazione, dovrai aggiungere --freeze app1 --freeze app2, ecc. A quella linea per includere anche quelle nella tua migrazione.

In questo modo si imposta la struttura del file di migrazione di base, ma le migrazioni forwards esono vuote. Sta a te determinare la logica che migra i dati da uno all'altro. Ma questo funziona come qualsiasi altra cosa in Django, tranne che tu usi il South ORM. Per qualsiasi modello della tua app in cui risiede questa migrazione, usi orm.MyModel.objects per qualsiasi altra app che hai aggiunto con i parametri --freeze, usi orm['someapp.SomeModel'].objects.

Oltre a ciò, si ottiene/filtro/crea, ecc., Gli oggetti come normalmente si spostano i dati da uno all'altro. Ovviamente, la migrazione in avanti richiede la logica che sposta i dati dove si desidera ora e la migrazione all'indietro dovrebbe avere la logica necessaria per ripristinare i dati nel punto in cui era originariamente.

È quindi possibile migrare avanti e indietro nel proprio ambiente di sviluppo per assicurarsi che funzioni correttamente. Una nota importante: questo è solo per lo spostamento dei dati in giro. NON alterare o eliminare alcuna struttura di tabella nella tua migrazione dei dati. Se è necessario eliminare le tabelle dopo che i dati sono stati spostati. Creare una schemamigrazione dopo la migrazione dei dati.

+0

con Django 1.11 e verso l'alto devi usare 'python manage.py makemigrations --empty yourappname' per creare un file di migrazione vuoto – Laky