Ограничения БД против метода 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()
вызывается первым.
У меня есть два вопроса (связанные, но не идентичные этому вопросу):
- Есть ли способ изменить порядок оценки (
clean()
→ExclusionConstraint
)? - Какой метод (
save()
?) мне нужно переопределить, чтобы пойматьIntegrityError
, вызванный ограничением?
[Django 4.1.5/Python 3.11.1/PostgreSQL 14.6]