何时在Django中使用NullBooleanField

时间:2018-03-09 16:48:28

标签: django django-models

我有一个按钮,当点击时,应该保存在用户喝水的数据库中。我只想检查NullBooleanField是否是定义它的正确方法。

一个更广泛的问题,即如果回答对社区有用,则列出了使用NullBooleanField的最佳环境。但我不是在这里问。以防您想要更好的挑战。

提前谢谢你。

5 个答案:

答案 0 :(得分:4)

要确定是否应使用BooleanFieldNullBooleanField,您需要回答的问题实际上是关于您希望在模型中表示的字段值的可能状态:< / p>

2种可能的状态:

  • 用户喝醉水
  • 用户没有喝水

→使用BooleanField

3种可能的状态:

  • 用户喝醉水
  • 用户没有喝水
  • 目前尚不清楚用户是否饮用过水

→使用NullBooleanField

答案 1 :(得分:1)

我认为只有在有三种可能的选择时才应使用NullBooleanField:未知,是(真)和否(假)。

在您的情况下,您只有两个可能的值 - 是(用户喝醉水)和否(用户没有喝水),因此BooleanField会更好。

在您的案例中使用BooleanField的另一个原因是,此字段的默认表单窗口小部件是CheckboxInput (docs),而NullBooleanField的默认表单窗口小部件}是NullBooleanSelect (docs)。由于您使用了复选框,因此BooleanField可以更好地完成工作。

答案 2 :(得分:1)

Django 2.1将null=True插入BooleanField。使用NullBooleanFieldnow discouraged

因此,使用x = BooleanField(null=True)代替x = NullBooleanField()

决定何时启用null值非常简单:如果只想记录“是”或“否”状态,请使用不带null的布尔值。如果要设置3个条件“是”,“否”和“不知道”,请与null=True一起使用。

答案 3 :(得分:0)

利用NULL属性

当我需要在数据中强制执行某些特定约束但允许其他约束时,我经常使用它。多个NULL值可以共存于定义的UNIQUE列中。让我们以地址模型实现为例:

业务规则是:

  • 用户最多可以有1个帐单邮寄地址
  • 一个用户可以有多个送货地址

一种实现方法是通过制作一个address表,该表带有指向user的外键和一个额外的标志,该标志指示该地址是否为帐单地址:

class Address(models.Model):
    ...  # <- address fields

    user = models.ForeignKey(User, on_delete=models.CASCADE)
    billing_address = models.NullBooleanField(default=None)

您现在可以通过将userbilling_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的任何新字段都将导致表被重写,对于小型表来说是可以的,但是可以大表要花费大量时间和资源,并且在重新写入过程中您将无法写入表