У меня есть существующий проект 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/
class Meta: abstract = True
на свойBaseModel
, а не на его потомков. docs.djangoproject.com/en/1.3/topics /дб/модели/ - person Etienne   schedule 18.08.2011