У меня есть существующий проект 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.
Итак, во-первых, будет ли это работать? И, во-вторых, есть ли лучший способ сделать это?
Update:
Мое окончательное решение подробно описано здесь:
http://www.markliu.me/2011/aug/23/migrating-a-django-postgres-db-from-concrete-inhe/