У меня есть существующий проект Django, в котором есть несколько моделей, использующих конкретное наследование базового класса.После более внимательного изучения и прочтения того, что такие люди, как Джейкоб Каплан-Мосс , должны сказать об этом , использование этого конкретного наследования в моем случае не требуется.Я хотел бы перейти на использование абстрактного базового класса.
Сложность заключается в том, что мой сайт работает и у меня есть данные, введенные пользователем.Таким образом, мне нужно будет сохранить все мои данные без изменений в течение этого перехода.
Я приведу пример, который будет более конкретным:
До:
app1 / models.py:
class Model1(base_app.models.BaseModel):
field1 = models.CharField(max_length=1000)
field2 = models.CharField(max_length=1000)
app2 / models.py:
class Model2(base_app.models.BaseModel):
field1 = models.CharField(max_length=1000)
field2 = models.CharField(max_length=1000)
base_app / models.py:
class BaseModel(models.Model):
user = models.ForeignKey(User)
another_field = models.CharField(max_length=1000)
После:
app1 / models.py:
class Model1(base_app.models.BaseModel):
field1 = models.CharField(max_length=1000)
field2 = models.CharField(max_length=1000)
app2 / models.py:
class Model2(base_app.models.BaseModel):
field1 = models.CharField(max_length=1000)
field2 = models.CharField(max_length=1000)
base_app / models.py:
class BaseModel(models.Model):
user = models.ForeignKey(User)
another_field = models.CharField(max_length=1000)
class Meta:
abstract = True
Сейчас я планирую сначала добавить abstract = True
в BaseModel.Затем для каждой модели, использующей BaseModel
, по одному за раз:
- Используйте юг, чтобы перенести базу данных и создать эту миграцию, используя флаг --auto
- Используйте югперенос данных.Например, я бы перебрал каждый объект в Model1, чтобы получить объект в BaseModel с тем же pk и скопировать значения для каждого поля объекта BaseModel в объект Model1.
Итак, во-первых,это будет работать?И второе: есть ли лучший способ сделать это?
Обновление:
Мое окончательное решение подробно описано здесь:
http://www.markliu.me/2011/aug/23/migrating-a-django-postgres-db-from-concrete-inhe/