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

81
  • null=True
  • blank=True
  • default = 0

这些有什么不同?在什么情况下使用它们?

5个回答

90

来自 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

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


31
我认为这可能不太清楚:要使一个整数字段在表格和数据库中都可为空,必须同时设置null=True 和 blank=True。参见:https://code.djangoproject.com/wiki/NewbieMistakes#IntegerNULLS - fjsj
我认为这应该由Django社区解决,因为它非常令人困惑。 “仅对于非字符串字段(如整数)使用null=True” Django可以像处理auto_now和auto_now_add一样处理它。 “选项auto_now、auto_now_add和default是互斥的。只能存在其中一个选项。” - Gregory
1
@Gregory:正如所解释的那样,null 是关于数据库存储的。Django揭示了SQL数据库中一个有用但相对危险的方面。这确实是一些必须在文档中解释而不是通过代码限制或强制执行的内容——没有任何限制可以被强制执行而不破坏有用(尽管可能是边缘情况)的功能。 - Chris Morgan

22

来自文档:

null 如果设置为True,Django将在数据库中将空值存储为NULL。默认值为False。

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

default 该字段的默认值。

您可以使用 "default" 来设置字段的默认值,如果您的代码没有显式地将其设置为某个值,则将使用该默认值。

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

如果您想将空值存储为 "null",请使用 "null"。然而,通常更喜欢将空值设置为空字符串或0,具体取决于给定字段的情况。


21
我知道您已经有了答案,但直到今天,很难判断是否将null=Trueblank=Trueboth放入字段。我个人认为,为开发人员提供如此多的选项是相当无用和令人困惑的。让他们处理空值或空白,他们可以按照自己的方式处理。
我遵循这个表格(来自书籍“Django的两个球”): When to use null and blank When to use null and blank

4
我知道这个。它来自于《Django两球》这本书。这是一份很好的资源,尽管有点过时(自1.5版以来是否有新版本?)。你真的应该承认并给予他们使用他们材料的信用。 - Malik A. Rumi
谢谢!我正好在找这个! - ann.piv
请忽略上表中关于NullBooleanField的部分 - 它在Django 3.1中已被弃用(来源:https://docs.djangoproject.com/en/3.0/ref/models/fields/#nullbooleanfield,并在Django 4.0中删除(来源:https://docs.djangoproject.com/en/4.0/releases/4.0/)。更多信息请参见:https://codereviewdoctor.medium.com/nullbooleanfield-is-dead-7d3fc286ed6e。我在实现NullBooleanField后浏览了Django发布说明,并在4.0版本说明中发现了该字段的删除。幸运的是,在提交代码之前就发现了这一点,并回到这里对上面的表格进行了警告。 - Andrew Selby

3

Null: 与数据库有关。用于定义一个给定的数据库列是否接受空值。

Blank: 与验证有关。在调用form.is_valid()进行表单验证时使用。

Default: 如果未为该字段提供任何值,则始终将默认值存储到该字段中。

null和blank的默认值为False

也就是说,拥有null=True和blank=False的字段是可以的。这意味着在数据库级别上,该字段可以为NULL,但在应用程序级别上,它是必填字段。

现在,大多数开发人员犯的错误是:为CharField和TextField等基于字符串的字段定义null=True。避免这样做。否则,您将最终拥有两个可能的“无数据”值,即:None和空字符串。拥有两个可能的“无数据”值是冗余的。Django约定使用空字符串,而不是NULL。


2

在实现方面:

'空白'字段对应所有表单。指定是否需要该值在表单中,并进行相应的表单验证。 'True'允许空值。

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

因此,如果在具有blank=true的管理员中留下一个字段为空,则会将NULL输入到数据库中。现在,如果数据库中的特定列被指定为NOT NULL,则可能会引发错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接