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'
)
]