Ограничения БД против метода clean() в Django

После создания метода clean() для избежания перекрытия диапазонов дат в форме администратора, я добавил ExclusionContraint для обеспечения целостности и на уровне БД:

class DateRangeFunc(models.Func):
    function = 'daterange'
    output_field = DateRangeField()

class Occupancy(models.Model):
    unit = models.ForeignKey(Unit, on_delete=models.CASCADE)
    number_of = models.IntegerField()
    begin = models.DateField()
    end = models.DateField(default=datetime.date(9999,12,31))

    class Meta:
        constraints = [
            ExclusionConstraint(
                name="exclude_overlapping_occupancies",
                expressions=(
                    (
                        DateRangeFunc(
                            "begin", "end", RangeBoundary(inclusive_lower=True, inclusive_upper=True)
                        ),
                        RangeOperators.OVERLAPS,
                    ),
                    ("unit", RangeOperators.EQUAL),
                ),
            ),
        ]

Это ограничение работает как ожидалось, но оно, похоже, предшествует clean(), потому что любое перекрытие вызывает IntegrityError для формы администратора. Я бы ожидал, что clean() вызывается первым.

У меня есть два вопроса (связанные, но не идентичные этому вопросу):

  1. Есть ли способ изменить порядок оценки (clean()ExclusionConstraint)?
  2. Какой метод (save()?) мне нужно переопределить, чтобы поймать IntegrityError, вызванный ограничением?

[Django 4.1.5/Python 3.11.1/PostgreSQL 14.6]

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