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),
),
Вернуться на верх