Перенос данных из одной модели в другую с помощью Django South - PullRequest
6 голосов
/ 24 октября 2011

В настоящее время у меня есть структура, которую необходимо переписать, чтобы справиться с 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 Ответ

15 голосов
/ 24 октября 2011

Вы создаете миграцию данных:

$ python manage.py datamigration yourapp name_of_this_migration

Это замораживает модели в вашем приложении.Если в миграции участвуют / участвуют другие приложения, вам нужно добавить --freeze app1 --freeze app2 и т. Д. К этой строке, чтобы включить их и в вашу миграцию.

Это устанавливает основныеСтруктура файла миграции для вас, но миграции forwards и backwards пусты.Это зависит от вас, чтобы определить логику, которая будет переносить данные из одного в другой.Но это работает как и все в Django, за исключением того, что вы используете South ORM.Для любой модели вашего приложения, в которой находится эта миграция, вы используете orm.MyModel.objects для любого другого приложения, добавленного вами с параметрами --freeze, вы используете orm['someapp.SomeModel'].objects.

Кроме этого, вы просто получаете/ filter / create и т. д. объекты как обычно перемещают данные от одного к другому.Очевидно, что ваша прямая миграция нуждается в логике, которая перемещает данные туда, куда вы хотите, и ваша обратная миграция должна иметь логику, необходимую для восстановления данных туда, где они были изначально.

Затем вы можете мигрировать вперед и назад.в вашей среде разработки, чтобы убедиться, что он работает правильно.Одно важное замечание: это только для перемещения данных.НЕ изменяйте и не удаляйте какие-либо структуры таблиц в вашей миграции данных.Если вам нужно удалить таблицы после перемещения данных.Создайте схему миграции после миграции данных.

...