Django: ограничение с нулевыми условиями по нескольким полям

У меня есть модель в проекте Django/PostgreSQL и я хочу добавить следующие ограничения на три nullable поля: либо все поля являются NULL, либо все из них не являются.

Вот код (упрощенный):

class SomeModel(models.Model):
    ...
    a = models.IntegerField(nullable=True)
    b = models.DateTimeField(nullable=True)
    c = models.DateTimeField(nullable=True)
    ...

    class Meta:
        constraints = [
            models.CheckConstraint(
                check=(
                    (Q(a__isnull=True) & Q(b__isnull=True) & Q(c__isnull=True)) |
                    (Q(a__isnull=False) & Q(b__isnull=False) & Q(c__isnull=False))
                )
            )
        ]

Если я правильно понимаю, я только что описал два возможных состояния этих трех полей. Первое - "все три - NULL", второе - "ни одно из них не NULL".

Но на самом деле я получил следующее: "Ни одно из них не может быть NULL". Админ-панель Django настаивает на заполнении всех полей, все они обязательны. Как я могу исправить такое поведение? Спасибо!

Это не связано с ограничениями, вы должны указать blank=True [Django-doc], когда вы хотите разрешить оставлять поля формы пустыми, и таким образом по умолчанию None/NULL:

class SomeModel(models.Model):
    # …
    a = models.IntegerField(null=True, blank=True)
    b = models.DateTimeField(null=True, blank=True)
    c = models.DateTimeField(null=True, blank=True)

    class Meta:
        constraints = [
            models.CheckConstraint(
                check=Q(a=None, b=None, c=None) |
                      Q(a__isnull=False, b__isnull=False, c__isnull=False),
                name='all_or_none_null'
            )
        ]
Вернуться на верх