Django IntegrityError: Нарушение ограничения уникальности
Я работаю над проектом Django, используя Django Rest Framework (DRF) и PostgreSQL, с моделью Scan, которая отслеживает различные фазы сканирования этикетки. Я установил уникальное ограничение на комбинацию полей label_id и phase, чтобы предотвратить дублирование сканирования одной и той же метки в одной и той же фазе. Вот моя модель сканирования:
class Scan(models.Model):
user = models.ForeignKey("accounts.User", on_delete=models.CASCADE)
label = models.ForeignKey("labels.Label", on_delete=models.CASCADE)
phase = models.IntegerField(
choices=ScanPhaseChoice.choices,
default=ScanPhaseChoice.unknown.value,
)
distribution = models.ForeignKey("factories.Distribution", null=True, blank=True, on_delete=models.CASCADE)
store = models.ForeignKey("factories.Store", null=True, blank=True, on_delete=models.CASCADE)
created_date = models.DateTimeField(auto_now_add=True)
updated_date = models.DateTimeField(auto_now=True)
class Meta:
unique_together = ["label", "phase"]
Когда я пытаюсь создать новое сканирование, я получаю эту ошибку:
django.db.utils.IntegrityError: duplicate key value violates unique constraint "labels_scan_label_id_phase_81ec6788_uniq"
DETAIL: Key (label_id, phase)=(413, 1) already exists.
Я проверил, что комбинация label_id и phase уже существует в базе данных, но я не уверен, почему эта ошибка возникает, когда я использовал full_clean() для проверки данных в методе save().
Что я пробовал
- Убедитесь, что ограничение определено как в базе данных, так и в метаклассе модели.
- Добавление validate_unique в методы clean и save, но это не предотвратило ошибку.
- Использование full_clean() в методе save, ожидая, что он проверит уникальные ограничения.
Вопросы
- Почему full_clean() не перехватывает нарушение ограничения уникальности в методе save()? Я думал, что full_clean() будет проверять уникальность, но, похоже, в данном случае этого не происходит.
- Существует ли лучшая практика для обработки нарушений уникальных ограничений в Django при использовании DRF и PostgreSQL для случаев, когда комбинация может уже существовать?
- Нужно ли проверять дубликаты вручную в методе save(), или есть более эффективный способ предотвратить эту ошибку?
Любые соображения о том, почему это происходит, и предложения о том, как с этим справиться, будут очень признательны. Спасибо!