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().

Что я пробовал

  1. Убедитесь, что ограничение определено как в базе данных, так и в метаклассе модели.
  2. Добавление validate_unique в методы clean и save, но это не предотвратило ошибку.
  3. Использование full_clean() в методе save, ожидая, что он проверит уникальные ограничения.

Вопросы

  1. Почему full_clean() не перехватывает нарушение ограничения уникальности в методе save()? Я думал, что full_clean() будет проверять уникальность, но, похоже, в данном случае этого не происходит.
  2. Существует ли лучшая практика для обработки нарушений уникальных ограничений в Django при использовании DRF и PostgreSQL для случаев, когда комбинация может уже существовать?
  3. Нужно ли проверять дубликаты вручную в методе save(), или есть более эффективный способ предотвратить эту ошибку?

Любые соображения о том, почему это происходит, и предложения о том, как с этим справиться, будут очень признательны. Спасибо!

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