Миграция Django — Как исправить уникальность=True при миграции (в обратном направлении)?

#django #django-models #django-migrations

#джанго #джанго-модели #джанго-миграции

Вопрос:

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

Это, очевидно, вызовет Key (field)=(foo) is duplicated

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

Ответ №1:

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

Комментарии:

1. Да, дело в том, что у меня уже есть дублированные значения. Мне придется отредактировать их перед запуском миграции. Спасибо!

Ответ №2:

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

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

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

Сделайте и то, и другое в рамках миграции.

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

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

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

Комментарии:

1. У меня уже есть дублированные значения, и я не могу удалить базу данных. Добавление индексов звучит для меня хорошо!