我有一个按钮,当点击时,应该保存在用户喝水的数据库中。我只想检查NullBooleanField是否是定义它的正确方法。
一个更广泛的问题,即如果回答对社区有用,则列出了使用NullBooleanField的最佳环境。但我不是在这里问。以防您想要更好的挑战。
提前谢谢你。
答案 0 :(得分:4)
要确定是否应使用BooleanField
或NullBooleanField
,您需要回答的问题实际上是关于您希望在模型中表示的字段值的可能状态:< / p>
2种可能的状态:
→使用BooleanField
3种可能的状态:
→使用NullBooleanField
。
答案 1 :(得分:1)
我认为只有在有三种可能的选择时才应使用NullBooleanField
:未知,是(真)和否(假)。
在您的情况下,您只有两个可能的值 - 是(用户喝醉水)和否(用户没有喝水),因此BooleanField
会更好。
在您的案例中使用BooleanField
的另一个原因是,此字段的默认表单窗口小部件是CheckboxInput
(docs),而NullBooleanField
的默认表单窗口小部件}是NullBooleanSelect
(docs)。由于您使用了复选框,因此BooleanField
可以更好地完成工作。
答案 2 :(得分:1)
Django 2.1将null=True
插入BooleanField
。使用NullBooleanField
是now discouraged。
因此,使用x = BooleanField(null=True)
代替x = NullBooleanField()
决定何时启用null值非常简单:如果只想记录“是”或“否”状态,请使用不带null的布尔值。如果要设置3个条件“是”,“否”和“不知道”,请与null=True
一起使用。
答案 3 :(得分:0)
当我需要在数据中强制执行某些特定约束但允许其他约束时,我经常使用它。多个NULL
值可以共存于定义的UNIQUE
列中。让我们以地址模型实现为例:
业务规则是:
一种实现方法是通过制作一个address
表,该表带有指向user
的外键和一个额外的标志,该标志指示该地址是否为帐单地址:
class Address(models.Model):
... # <- address fields
user = models.ForeignKey(User, on_delete=models.CASCADE)
billing_address = models.NullBooleanField(default=None)
您现在可以通过将user
和billing_address
设置为唯一来简单地在数据库级别实施业务规则。
class Meta:
constraints = [
models.UniqueConstraint(
fields=['user', 'billing_address'],
name='ensure single billing address'
)
]
实现此目的的窍门是,当地址为帐单地址时,billing_address
必须为True
,但应为None
(而不是{{1} }),如果该地址是送货地址。
您可以通过添加另一个约束来确保未添加任何False
值,从而进一步执行验证。但这通常不是必需的,可以在应用程序级别完成:
False
答案 4 :(得分:0)
对PostgreSQL数据库使用NullBooleanField
的最大优势是您的表将不会被重写,没有null=True
的任何新字段都将导致表被重写,对于小型表来说是可以的,但是可以大表要花费大量时间和资源,并且在重新写入过程中您将无法写入表