在 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)。

除非您有充分的理由,否则请避免在基于字符串的字段(例如 CharFieldTextField)上使用 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 如果为 True,Django 将存储为空 数据库中的值为 NULL。 默认为 False。

blank如果为True,则允许该字段 为空白。默认为 False。

default 的默认值 字段。

如果您的代码未明确将其设置为某个值,您可以使用“default”来设置将用于相关字段的值。

使用“blank”进行表单验证 - blank=True 将允许将字段设置为空值

如果您想在数据库中将空值存储为“null”,请使用“null”。但是,通常最好将空白值设置为空字符串或针对给定字段设置为 0。

【讨论】:

【参考方案3】:

在实现方面:

“空白”字段对应于所有表单。指定表单中是否需要此值并完成相应的表单验证。 'True' 允许空值。

“null”字段对应于数据库级别。它将在 DB 中设置为 NULL 或 NOT NULL。

因此,如果在管理员中将字段留空且空白=true,则将 NULL 输入数据库。现在,如果将 DB 中的特定列指定为 NOT NULL,这可能会引发错误。

【讨论】:

【参考方案4】:

我知道你已经有了答案,但是直到今天,还很难判断是将 null=Trueblank=True 还是 both 放到字段中。我个人认为给开发者提供这么多选择是相当无用和混乱的。让他们随心所欲地处理空值或空白。

我遵循这张表(来自“Two Scoops of Django”一书):

【讨论】:

我承认这一点。它来自《Django 的两勺》一书。一个很棒的,如果过时的(自 1.5 以来是否有新版本?)资源。你真的应该承认并赞扬他们使用他们的材料。 谢谢!我只是在找这个!【参考方案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 中?

models.py中增加了字段,django中怎样更新

django 反向生成models.py

django使用models创建表

你真的可以用 Django 扩大规模吗……鉴于你只能使用一个数据库? (在 models.py 和 settings.py 中)