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