Как справиться с отсутствующими столбцами при миграции старых данных?

Я хочу добавить новый столбец в модель 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")
Вернуться на верх