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