Ограничение 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, чтобы указать значение, не относящееся к диапазону, для фильтрации строк, к которым вы хотите применить ограничения диапазона.

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