Django migration- Как исправить uniqueness=True при миграции (назад)?

Раньше поле в моей модели не имело ограничений. Но чтобы избежать проблем в будущем, мне нужно сделать поле unique=True.

Очевидно, это вызовет ошибку Key (field)=(foo) is duplicated

Каким образом лучше всего исправить эту миграцию в обратном направлении, чтобы не возникала ошибка?

Ограничение применяется на уровне базы данных, поэтому если в вашей таблице есть существующие данные, которые не удовлетворяют ограничению, вы не сможете избежать ошибки. Перед установкой unique=True вы должны удалить дублирующиеся значения или изменить их. В противном случае вы могли бы проверить уникальность в методе модели save или в проверке формы/сериализатора вместо использования ограничения базы данных.

Это зависит от того, как вы переносите вещи.

Если вы можете снести базу данных на время миграции, то это намного проще.

  1. Удалите все дубликаты.
  2. Добавьте уникальный флаг.

Выполните оба этих действия как часть миграции.

Если, с другой стороны, вам нужно поддерживать все в рабочем состоянии, то процесс состоит из трех шагов:

  1. Добавьте валидацию в любой код, создающий запись в этой таблице (в основном это методы save, но следите и за другими), чтобы добавление больше дублирующих значений было невозможным. (Для этого можно добавить индекс в таблицу по уникальному полю, но это может и не понадобиться в зависимости от размера данных, требований к производительности и т.д.)

  2. Когда все готово и вы знаете, что в БД есть только старые дубликаты, и больше их добавить нельзя, удалите эти дубликаты в соответствии с правилами, которые вы используете для определения того, какие записи удалять.

  3. Наконец, запустите миграцию, чтобы добавить флаг unique к полю.

2 и 3 могут быть выполнены из скрипта миграции, но важно, чтобы шаг 1 был выполнен первым, чтобы вы не добавили новые dups во время или после очистки.

Вернуться на верх