在 Django models.py 中,default、null 和 blank 有啥区别?
Posted
技术标签:
【中文标题】在 Django models.py 中,default、null 和 blank 有啥区别?【英文标题】:In Django models.py, what's the difference between default, null, and blank?在 Django models.py 中,default、null 和 blank 有什么区别? 【发布时间】:2011-05-22 00:15:08 【问题描述】:null=True
blank=True
default = 0
有什么区别?你什么时候用什么?
【问题讨论】:
【参考方案1】:直接来自Django model field reference:
Field.null
如果
True
,Django 会将空值作为NULL
存储在数据库中。默认为False
。请注意,空字符串值将始终存储为空字符串,而不是
NULL
。仅将null=True
用于非字符串字段,例如整数、布尔值和日期。对于这两种类型的字段,如果您希望在表单中允许空值,您还需要设置blank=True
,因为null
参数只影响数据库存储(请参阅blank
)。除非您有充分的理由,否则请避免在基于字符串的字段(例如
CharField
和TextField
)上使用null
。如果基于字符串的字段有null=True
,这意味着它有两个可能的“无数据”值:NULL 和空字符串。在大多数情况下,“无数据”有两个可能的值是多余的; Django 约定是使用空字符串,而不是NULL
。
Field.blank
如果
True
,该字段允许为空。默认为False
。请注意,这与
null
不同。null
纯粹与数据库相关,而blank
与验证相关。如果一个字段有blank=True
,Django 管理站点上的验证将允许输入一个空值。如果字段有blank=False
,则该字段为必填项。
Field.default
字段的默认值。这可以是一个值或可调用对象。如果可调用,则每次创建新对象时都会调用它。
【讨论】:
我认为这可能不是每个人都清楚:对于 IntegerField 在表单和数据库上都可以为空,必须同时具有 null=True 和 blank=True。见:code.djangoproject.com/wiki/NewbieMistakes#IntegerNULLS 我认为它应该由 Django 社区解决,因为它非常令人困惑。 “仅对整数等非字符串字段使用 null=True” Django 可以像处理 auto_now 和 auto_now_add 一样处理它。 “选项 auto_now、auto_now_add 和 default 是互斥的。这些选项只能存在一个。” @Gregory:如前所述,null
是关于数据库存储的。 Django 暴露了 SQL 数据库一个有用但相对危险的方面。这确实是必须在文档中解释的东西,而不是在代码中限制或强制执行——没有任何限制可以在不破坏有用(尽管可能是极端情况)功能的情况下强制执行。【参考方案2】:
来自docs:
null
如果为真,Django 将存储为空 数据库中的值为 NULL。 默认为 False。
blank
如果为True,则允许该字段 为空白。默认为 False。
default
的默认值 字段。
如果您的代码未明确将其设置为某个值,您可以使用“default
”来设置将用于相关字段的值。
使用“blank
”进行表单验证 - blank=True 将允许将字段设置为空值
如果您想在数据库中存储一个空值作为“null”,请使用“null
”。但是,通常最好将空白值设置为空字符串或针对给定字段设置为 0。
【讨论】:
【参考方案3】:我知道你已经有了答案,但是直到今天,还很难判断是将 null=True
或 blank=True
还是 both
放到字段中。我个人认为给开发者提供这么多选择是相当无用和混乱的。让他们随心所欲地处理空值或空白。
我遵循这张表(来自“Two Scoops of Django”一书):
【讨论】:
我承认这一点。它来自《Django 的两勺》一书。一个很棒的,如果过时的(自 1.5 以来是否有新版本?)资源。你真的应该承认并赞扬他们使用他们的材料。 谢谢!我只是在找这个!【参考方案4】:在实现方面:
“空白”字段对应于所有表单。指定表单中是否需要此值并完成相应的表单验证。 'True' 允许空值。
“null”字段对应于数据库级别。它将在 DB 中设置为 NULL 或 NOT NULL。
因此,如果在管理员中将字段留空且空白=true,则将 NULL 输入数据库。现在,如果将 DB 中的特定列指定为 NOT NULL,这可能会引发错误。
【讨论】:
【参考方案5】:Null:与数据库相关。定义给定的数据库列是否接受空值。
空白:与验证相关。它将在表单验证期间调用 form.is_valid() 时使用。
默认:如果没有为该字段提供任何值,则始终将给定值(默认值)存储到该字段。
null 和blank 的默认值为False。
话虽如此,拥有一个 null=True 和 blank=False 的字段是完全可以的。表示在数据库级别该字段可以为 NULL,但在应用程序级别它是必填字段。
现在,大多数开发人员都搞错了:为 CharField 和 TextField 等基于字符串的字段定义 null=True。避免这样做。否则,您最终会得到两个可能的“无数据”值,即:None 和一个空字符串。 “无数据”有两个可能的值是多余的。 Django 的约定是使用空字符串,而不是 NULL。
【讨论】:
以上是关于在 Django models.py 中,default、null 和 blank 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
Django:在models.py中将TimeField更改为DateTimeField
为啥 django 强制所有模型类都在 models.py 中?
你真的可以用 Django 扩大规模吗……鉴于你只能使用一个数据库? (在 models.py 和 settings.py 中)