Как справиться с отсутствующими столбцами при миграции старых данных?
Я хочу добавить новый столбец в модель django. Однако у меня есть прошлая миграция данных, которая создает объект этой модели, который теперь не работает, потому что столбец не существовал во время этой миграции.
т.е. моя модель такова:
class MyModel(models.Model):
name = models.CharField()
foo = models.IntegerField() # <-- I want to add this column
Однако моя старая миграция выглядит следующим образом:
def add_my_model(apps, schema_editor):
MyModel.objects.create(name="blah")
class Migration(migrations.Migration):
# ...
operations = [
migrations.RunPython(add_my_model),
]
Когда я пытаюсь запустить миграцию на свежей базе данных, эта миграция завершается с ошибкой, подобной этой:
query = 'INSERT INTO "my_model" ("name", "foo") VALUES (?, ?)'
params = ['blah', None]
...
E sqlite3.OperationalError: table my_model has no column named foo
Как лучше поступить в этой ситуации?
Это объясняется в Джанго документации:
def combine_names(apps, schema_editor):
# We can't import the Person model directly as it may be a newer
# version than this migration expects. We use the historical version.
Person = apps.get_model('yourappname', 'Person')
В принципе, вместо прямого импорта MyModel вы должны делать что-то вроде
def add_my_model(apps, schema_editor):
MyModel = apps.get_model('yourappname', 'MyModel')
MyModel.objects.create(name="blah")