Django migration- Как исправить uniqueness=True при миграции (назад)?
Раньше поле в моей модели не имело ограничений.
Но чтобы избежать проблем в будущем, мне нужно сделать поле unique=True
.
Очевидно, это вызовет ошибку Key (field)=(foo) is duplicated
Каким образом лучше всего исправить эту миграцию в обратном направлении, чтобы не возникала ошибка?
Ограничение применяется на уровне базы данных, поэтому если в вашей таблице есть существующие данные, которые не удовлетворяют ограничению, вы не сможете избежать ошибки. Перед установкой unique=True
вы должны удалить дублирующиеся значения или изменить их. В противном случае вы могли бы проверить уникальность в методе модели save
или в проверке формы/сериализатора вместо использования ограничения базы данных.
Это зависит от того, как вы переносите вещи.
Если вы можете снести базу данных на время миграции, то это намного проще.
- Удалите все дубликаты.
- Добавьте уникальный флаг.
Выполните оба этих действия как часть миграции.
Если, с другой стороны, вам нужно поддерживать все в рабочем состоянии, то процесс состоит из трех шагов:
Добавьте валидацию в любой код, создающий запись в этой таблице (в основном это методы
save
, но следите и за другими), чтобы добавление больше дублирующих значений было невозможным. (Для этого можно добавить индекс в таблицу по уникальному полю, но это может и не понадобиться в зависимости от размера данных, требований к производительности и т.д.)Когда все готово и вы знаете, что в БД есть только старые дубликаты, и больше их добавить нельзя, удалите эти дубликаты в соответствии с правилами, которые вы используете для определения того, какие записи удалять.
Наконец, запустите миграцию, чтобы добавить флаг
unique
к полю.
2 и 3 могут быть выполнены из скрипта миграции, но важно, чтобы шаг 1 был выполнен первым, чтобы вы не добавили новые dups во время или после очистки.