在Django的models.py中,default、null和blank有什么区别?

81 投票
5 回答
41843 浏览
提问于 2025-04-16 08:13
  • null=True:这个意思是说在数据库里,这个字段可以没有值,也就是可以是空的。
  • blank=True:这个是说在表单里,这个字段可以不填写,也就是可以留空。
  • default = 0:这个表示如果你没有给这个字段指定值,它会自动使用0作为默认值。

这三者有什么区别呢?什么时候用哪个呢?

5 个回答

21

我知道你已经有了答案,不过直到今天,判断一个字段是用 null=True 还是 blank=True,或者两个都用,还是挺困难的。我个人觉得给开发者提供这么多选项其实没什么用,还容易让人困惑。让他们自己决定怎么处理空值或空白值吧。

我参考了这张表(来自书籍《Django的两勺子》):

何时使用 null 和 blank

何时使用 null 和 blank

22

来自文档

null:如果设置为真,Django会把空值存储为数据库中的NULL。默认是假的。

blank:如果设置为真,这个字段可以留空。默认是假的。

default:这个字段的默认值。

你可以用"default"来设置一个默认值,如果你的代码没有给这个字段指定值,就会用这个默认值。

使用"blank"是为了表单验证——设置blank=True就允许这个字段留空。

如果你想在数据库中把空值存储为“null”,就用"null"。不过,通常情况下,建议把空值设置为一个空字符串或者0,这样更合适。

92

直接来自 Django模型字段参考

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

这个字段的默认值。可以是一个具体的值,也可以是一个可调用的对象。如果是可调用的对象,每次创建新对象时都会被调用。

撰写回答