2011-10-24 17 views
6

Actualmente tengo una estructura que necesita ser reescrito con el fin de hacer frente a Django-CMSdatos de migrar de un modelo a otro con Django Sur

Actualmente la configuración es la siguiente

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) 

cuando ahora transfiero todos mis campos de Video a VideoPlugin, ejecuto mi migración schema, también me gustaría transferir TODA la información de Video a VideoPlugin cuando ejecuto la migración.

¿Alguien tiene un ejemplo de cómo se puede lograr esto?

Aquí es la a principios de la migración que se ejecute

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) 

     ... 

Su ayuda es muy apreciada

+0

posible duplicado de [¿Cómo migro un modelo de una aplicación django a una nueva?] (Http://stackoverflow.com/questions/1258130/how-do-i-migrate-a-model- out-of-one-django-app-and-into-a-new-one) – dbn

Respuesta

15

Se crea un datamigration:

$ python manage.py datamigration yourapp name_of_this_migration 

Esto congela los modelos en su aplicación. Si hay otras aplicaciones involucradas en la migración, deberá agregar --freeze app1 --freeze app2, etc., a esa línea para incluir también las de su migración.

Esto configura la estructura básica del archivo de migración, pero las migraciones forwards y backwards están vacías. Depende de usted determinar la lógica que migrará los datos de uno a otro. Pero esto funciona como cualquier otra cosa en Django, excepto que usas el ORM Sur. Para cualquier modelo en su aplicación en la que reside esta migración, use orm.MyModel.objects para cualquier otra aplicación que agregue con los parámetros --freeze, use orm['someapp.SomeModel'].objects.

Aparte de eso, acaba de obtener/filtrar/crear, etc., los objetos de forma normal moviendo los datos de uno a otro. Obviamente, su migración hacia adelante necesita la lógica que mueve los datos a donde lo desea ahora, y su migración hacia atrás debería tener la lógica necesaria para restaurar los datos a su ubicación original.

A continuación, puede migrar hacia adelante y hacia atrás en su entorno de desarrollo para asegurarse de que funciona correctamente. Una nota importante: esto es solo para mover datos. NO altere ni elimine ninguna estructura de tabla en su migración de datos. Si necesita eliminar tablas después de que se hayan movido los datos. Cree una migración de esquema después de la migración de datos.

+0

con Django 1.11 y versiones posteriores tiene que usar 'python manage.py makemigrations --empty yourappname' para crear un archivo de migración vacío – Laky

Cuestiones relacionadas