Мне было интересно, возможна ли следующая миграция с Django south и сохранить данные.
До:
В настоящее время у меня есть два приложения, один из которых называется tv, один называется кинофильмами, каждый с моделью VideoFile (упрощенный здесь):
ТВ /models.py:
class VideoFile(models.Model):
show = models.ForeignKey(Show, blank=True, null=True)
name = models.CharField(max_length=1024, blank=True)
size = models.IntegerField(blank=True, null=True)
ctime = models.DateTimeField(blank=True, null=True)
фильмы /models.py:
class VideoFile(models.Model):
movie = models.ForeignKey(Movie, blank=True, null=True)
name = models.CharField(max_length=1024, blank=True)
size = models.IntegerField(blank=True, null=True)
ctime = models.DateTimeField(blank=True, null=True)
После
Поскольку два объекта видеофайлов настолько похожи, я хочу избавиться от дублирования и создать новую модель в отдельном приложении под названием media, которое содержит общий класс VideoFile и использовать наследование для его расширения:
СМИ /models.py:
class VideoFile(models.Model):
name = models.CharField(max_length=1024, blank=True)
size = models.IntegerField(blank=True, null=True)
ctime = models.DateTimeField(blank=True, null=True)
ТВ /models.py:
class VideoFile(media.models.VideoFile):
show = models.ForeignKey(Show, blank=True, null=True)
фильмы /models.py:
class VideoFile(media.models.VideoFile):
movie = models.ForeignKey(Movie, blank=True, null=True)
Итак, мой вопрос: как я могу выполнить это с помощью django-south и все еще поддерживать существующие данные?
Все три этих приложения уже управляются южными миграциями, и в соответствии с южной документацией плохой практикой является объединение схемы и переноса данных, и они рекомендуют, чтобы это было сделано в несколько этапов.
Я думаю, что это можно сделать, используя отдельные миграции вроде этого (при условии, что media.VideoFile уже создан)
- Переход схемы для переименования всех полей в tv.VideoFile и movies.VideoFile, который переместится на новую версию media.VideoFile, возможно, на что-то вроде old_name, old_size и т.д.
- Переход схемы на tv.VideoFile и movies.VideoFile для наследования из media.VideoFile
- Перенос данных для копирования old_name для имени, old_size в размер и т.д.
- Переход схемы для удаления старых полей
Прежде чем я пройду всю эту работу, вы думаете, что это сработает? Есть ли лучший способ?
Если вам интересно, проект размещается здесь: http://code.google.com/p/medianav/