Невозможно применить миграцию на измененную модель в django
Я новичок в django. Я изменил некоторые поля в моей уже созданной модели Django. Но когда я пытаюсь применить к ней миграции, появляется следующее сообщение:
It is impossible to add a non-nullable field 'name' to table_name without specifying a default. This is because the database needs something to populate existing rows.
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
2) Quit and manually define a default value in models.py.
Хотя я удалил данные этой таблицы из базы данных. Я не могу установить ее значение по умолчанию, потому что поле должно хранить уникальные значения. Нужно ли мне удалить предыдущий файл миграции, связанный с этой таблицей?
Итак, раньше у вас было нулевое поле "name". Это означает, что можно установить null
в качестве значения этого поля.
Если вы добавите ограничение not null к этому полю (null=False
) и запустите миграцию, вы получите ошибку целостности из базы данных, поскольку в таблице есть строки, в которых null
установлено как значение этого поля.
В случае, если вы только что сделали две миграции, где сначала добавили поле с нулевым значением, но потом вспомнили, что оно не должно быть нулевым, и добавили ограничение not null, вам следует просто вернуть миграции и удалить предыдущую миграцию. Это самое чистое решение.
Вы можете вернуться, выполнив python manage.py migrate <app name> <the migration that you want to keep>
Затем вы просто удалите новые миграции и запустите python manage.py makemigrations
снова.
В случае, если миграция с полем nullable была определена очень рано, и там уже есть данные, и удалить эту миграцию невозможно, вам нужно будет придумать, как заполнить эти данные. Поскольку вы говорите, что существует также ограничение уникальности, вы не можете просто предоставить значение по умолчанию, поскольку это вызовет проблемы с этим ограничением.
Мое предложение - отредактировать файл миграции и добавить migrations.RunSQL
, где вы напишите пользовательский SQL код, который будет вставлять значения в поле. Убедитесь, что вы поместили операцию RunSQL
перед операцией, которая добавляет ограничение not null (это должно быть AlterField
или AddConstraint
), так как они выполняются по порядку.
Вы также можете использовать migrations.RunPython
, но я предпочитаю RunSQL
, потому что будущие изменения в коде могут сломать ваши миграции, а это хлопотно.
Не имеет значения, очистите ли вы данные из таблицы, потому что если таблица существует для модели, это сообщение будет ответом по умолчанию для моделей Django. Вы можете либо добавить поле в модель вручную и подделать миграцию . Или вы можете рассмотреть возможность размещения значения по умолчанию в миграциях (как и было сказано в подсказке). Размещение значения по умолчанию не означает, что оно будет применять значение по умолчанию в таблице для новых записей. Это значение будет использоваться только при обновлении существующих строк в таблице во время миграции, чтобы облегчить процесс.
Кроме того, вы можете рассмотреть вариант миграции данных, который создаст пустые файлы миграции, в которых вы сможете сделать любые изменения, какие захотите, с данными (например, создать новые имена для полей).