Django官方文档不建议在基于字符串的字段上使用null=True
。 [source]
我知道他们不希望有两个不同的no data
值。因此,Django建议只使用空字符串作为no data
值。但是,为什么他们没有选择None
超过""
(空字符串)?
答案 0 :(得分:1)
当NULL和空字符串都表示"没有数据"时,您希望选择一个以保持一致性。如果您有选择,请选择类型稳定性,使用强类型语言更容易处理 - 即空字符串。但有时候你没有选择权。
假设您继承了一个字符串字段可以为空的数据库,并且许多行已经填充了NULL。通常情况下,前面的某个应用程序需要数据库中的NULL值并正在处理它们。
现在,如果您被告知将Django服务连接到同一个数据库,那么您不希望通过编写无字符串的空字符串来打破逻辑,因为另一个应用程序会错误地对待它们。例如,它不会正确显示警告,而是静默地打印空字符串。
当值总是来自表单时,用户无法在发送数据时或在加载数据时预先填充表单时区分NULL和空字符串。
所以我的答案是,如果表单是在数据库中写入数据的唯一方法,那么为了类型稳定性,空字符串可能是更好的选择,而如果表单不是唯一的源,则必须适应已经存在于数据库中的值的含义。
答案 1 :(得分:1)
@JulienD有权知道类型,但在模板方面也有实际的结果。假设您有一个表格,您可以使用对象的属性进行渲染。您可能希望缺少值为空。如果您使用NULL,那么您将获得Python None
,如果您在模板中使用{{ model.field }}
,则会将其呈现为None
。为避免这种情况,您只需打印该值,如果不是None
并手动检查或使用模板过滤器。
如果您使用blank=True
,则只需在模板中插入值而无需担心。空值只会插入''
。