Ограничение Django на производные поля
Я пытаюсь добавить непересекающееся ограничение на специфическое для Postgres поле DateRange:
from django.contrib.postgres.constraints import ExclusionConstraint
from django.contrib.postgres.fields import DateRangeField, RangeOperators
class MyModel(models.Model):
timespan = DateRangeField(blank=False, null=False)
status = models.CharField(max_length=8, choices=status_choices, blank=False, null=False)
class Meta:
constraints = [
ExclusionConstraint(
name='exclude_overlapping_offer',
expressions=[
('timespan', RangeOperators.OVERLAPS),
(models.Q(status='ACCEPTED'), RangeOperators.EQUAL),
],
)
В основном я хочу предотвратить появление в базе данных перекрывающихся записей, имеющих статус ACCEPTED.
Миграция проходит нормально, но когда я пытаюсь сохранить модель, то получаю ошибку:
AttributeError: 'Q' object has no attribute 'replace_expressions'
Есть ответ на сообщение об ошибке, в котором говорится, что объекты Q не допускаются в выражениях ограничений:
https://code.djangoproject.com/ticket/34805
Есть ли другой способ установить ограничение на производное поле?
Ответ кроется здесь:
https://docs.djangoproject.com/en/5.1/ref/contrib/postgres/constraints/
условие
ExclusionConstraint.condition Объект Q, задающий условие для ограничения ограничения подмножеством строк. Например, condition=Q(cancelled=False). Эти условия имеют те же ограничения базы данных, что и django.db.models.Index.condition
.
Используйте condition
, чтобы указать значение, не относящееся к диапазону, для фильтрации строк, к которым вы хотите применить ограничения диапазона.