Django ограничение, при котором условия IS NULL двух столбцов должны совпадать
Рассмотрим следующую модель.
class MyModel(models.Model):
a = models.DateField(blank=True, default=None, null=True)
b = models.DateField(blank=True, default=None, null=True)
Я хотел бы потребовать, чтобы и a, и b были NULL, или оба были NOT NULL. Я могу выразить это в необработанном DDL:
ALTER TABLE "app_mymodel" ADD CONSTRAINT "both_or_none_null" CHECK ((a IS NULL) = (b IS NULL));
Чтобы получить это через Django, я попытался
class Meta:
constraints = [
models.CheckConstraint(
check=Q(a__isnull=F('b__isnull')),
name='both_or_none_null'
)
]
Увы, это приводит к django.core.exceptions.FieldError: Joined field references are not permitted in this query, когда я пытаюсь применить полученную миграцию. Поэтому я прибегнул к менее лаконичному варианту
check=(Q(a__isnull=True) & Q(b__isnull=True)) | (Q(a__isnull=False) & Q(b__isnull=False))
что порождает соответствующее неуклюжее ограничение DDL. Но мой Django-фу ограничен, поэтому есть ли способ правильно выразить исходное ограничение?
Это должно сделать это:
models.CheckConstraint(
name="both_or_none_null",
check=Q(a__isnull=True, b__isnull=True) | Q(a__isnull=False, b__isnull=False),
),