Перенос данных из одной модели в другую с помощью Django South

У меня сейчас есть структура, которую нужно переписать, чтобы она могла работать с 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)

        ...

Ваша помощь очень ценится


person ApPeL    schedule 24.10.2011    source источник
comment
возможный дубликат Как перенести модель из одного приложения django в новое?   -  person dbn    schedule 18.12.2013


Ответы (1)


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

$ python manage.py datamigration yourapp name_of_this_migration

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

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

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

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

person Chris Pratt    schedule 24.10.2011
comment
с Django 1.11 и выше вы должны использовать python manage.py makemigrations --empty yourappname для создания пустого файла миграции - person Laky; 31.07.2017