Django:具有可为空的多字段条件的约束
Django: constraint with nullable multiple field conditions
我在 Django/PostgreSQL 项目中有一个模型,我想将以下约束添加到三个可为空的字段:要么 所有字段 都为 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”,第二个是“none 个是 NULL”。
但实际上我得到的是“none 其中可以为 NULL”。 Django 管理面板坚持填写所有字段,它们都是强制性的。我该如何解决这个问题?谢谢!
这不是由于限制,当你想允许将表单字段留空时,你应该指定 blank=True
[Django-doc],因此默认为 None
/NULL
:
class SomeModel(models.Model):
# …
a = models.IntegerField(<strong>null=True, blank=True</strong>)
b = models.DateTimeField(<strong>null=True, blank=True</strong>)
c = models.DateTimeField(<strong>null=True, blank=True</strong>)
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'
)
]
我在 Django/PostgreSQL 项目中有一个模型,我想将以下约束添加到三个可为空的字段:要么 所有字段 都为 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”,第二个是“none 个是 NULL”。
但实际上我得到的是“none 其中可以为 NULL”。 Django 管理面板坚持填写所有字段,它们都是强制性的。我该如何解决这个问题?谢谢!
这不是由于限制,当你想允许将表单字段留空时,你应该指定 blank=True
[Django-doc],因此默认为 None
/NULL
:
class SomeModel(models.Model):
# …
a = models.IntegerField(<strong>null=True, blank=True</strong>)
b = models.DateTimeField(<strong>null=True, blank=True</strong>)
c = models.DateTimeField(<strong>null=True, blank=True</strong>)
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'
)
]