在Django中,null=True和blank=True有什么区别?

1364

当我们在Django中添加模型字段时,通常会写成:

models.CharField(max_length=100, null=True, blank=True)

对于ForeignKeyDecimalField等字段也是如此操作。以下是关于在不同的(CharField, ForeignKey, ManyToManyField, DateTimeField)字段中应用:

  1. null=True仅针对
  2. blank=True仅针对
  3. null=Trueblank=True

有什么区别?使用选项1、2或3的优点和缺点是什么?


20
这里有关于这个问题的好回答:https://dev59.com/tWsz5IYBdhLWcg3wBzbi 和 https://dev59.com/_2855IYBdhLWcg3wXTAI。 - juliomalegria
6
好的阅读材料:http://www.b-list.org/weblog/2006/jun/28/django-tips-difference-between-blank-and-null/这篇文章讨论了在Django模型中使用"blank"和"null"选项的区别。简单来说,"blank"是用于验证表单数据的,而"null"是用于数据库存储的。如果一个字段可以为空,则应该将"blank"设置为True,并且如果该字段与数据库的NULL值相关联,则应该将"null"设置为True。此外,作者还讨论了一些关于如何正确使用这些选项的技巧和陷阱。 - salmatron
是的,我也有这样一个ForeignKey的应用场景,其中blank=True,但没有null=True。当保存模型时,我想通过创建已发布的条目来自动“发布”它。因此,我不能将null保存到数据库中,因为每个模型都必须是"published",但我希望能够在管理页面中留空该字段。 - Sergey Orshanskiy
1
我认为你可能会对将空的可空CharField保存为null而不是空字符串感兴趣。关于这个问题有很多讨论,你可能会遇到一个非常实际的问题(例如,你想为每个用户添加一个可以为空且应该是唯一的openid url)。 - ramwin
避免在CharField和TextField等基于字符串的字段上使用null。https://docs.djangoproject.com/en/3.1/ref/models/fields/ - Fernando Valente
28个回答

7

这里,null=Trueblank=True 的主要区别在于:

nullblank 的默认值都是 False。这两个值都作用于字段级别,即我们想要保留一个字段为空或空白。

null=True 将字段的值设置为 NULL,即没有数据。它基本上是针对数据库列值的。

date = models.DateTimeField(null=True)

blank=True 表示该字段在表单中是否为必填项,包括管理员和自定义表单。

title = models.CharField(blank=True) // title 可以为空。 在数据库中将存储("")null=True blank=True 表示该字段在任何情况下都是可选的。

epic = models.ForeignKey(null=True, blank=True)
// The exception is CharFields() and TextFields(), which in Django are never saved as NULL. Blank values a

6

null = True || blank = True || null = True && blank = True

可以翻译为:如果 "null = True" 或者 "blank = True",或者两者都为真(即 "null = True && blank = True"),则执行该操作。
class TestModel(models.Model):
    field1 = models.CharField(max_length=100, null=True)
    field2 = models.CharField(max_length=100, blank=True)   # it's not a correct way
    field3 = models.CharField(max_length=100, null=True, blank=True)

MySQL的数据库字段:

CREATE TABLE TestModel (
     `id`        INT(10)        NOT     NULL      AUTO_INCREMENT,

     `field1`    VARCHAR(100)   NULL    DEFAULT   NULL,
     `field2`    VARCHAR(100)   NOT     NULL,
     `field3`    VARCHAR(100)   NULL    DEFAULT   NULL,
)

案例一:null=True
db:   db   field is accepts null value
form: form field is `required`

NB: DB IS ACCEPTS NULL VALUE, BUT FORM FIELD IS REQUIRED. SO FORM IS 
SUBMITTED WHEN THIS FIELD HAVE SOME VALUE. it's good.

第二个案例: blank = True
db:   db   field is not accepts null value
form: form field is `optional`

NB: FORM IS VALID WITHOUT ANY VALUE, BUT DB IS NOT ACCEPTS NULL VALUE.
SO THE FORM IS SUBMITTED WITHOUT ANY VALUE THEN BOOM. it's worst.

案例-03:null = True && blank = True,翻译为:空值为真且空白为真。
db:   db   field is accepts null value
form: form field is `optional`

NB: HERE FORM FIELD IS OPTIONAL & FORM IS VALID WITHOUT ANY VALUE 
& DB ALSO ACCEPTS NULL VALUE. SO, IT'S BEST TO USE `null=True && blank=True`

:)


5
当我们在Django管理界面中保存任何内容时,会发生两步验证,分别是在Django层和数据库层。我们不能在数字字段中保存文本。
数据库有一个数据类型为NULL,它表示什么都没有。当Django在数据库中创建列时,它指定它们不能为空。如果您尝试保存NULL,将会收到数据库错误。
此外,在Django-Admin级别上,默认情况下所有字段都是必填的,您不能保存空字段,否则Django会抛出错误。
因此,如果您想保存空字段,则需要在Django和数据库层面上进行允许。 blank=True-将允许在管理面板中使用空字段 null=True-将允许将NULL保存到数据库列中。

4

以下是简单易懂的回答:

通过null = True,我们告诉数据库该模型字段可以为空;通过blank = True,我们告诉Django该模型字段可以为空。


4

null是针对数据库而言的,blank则是用于验证字段的有效性,如您想在用户界面中显示文本框以获取人的姓氏。 如果lastname=models.charfield (blank=true),则它不会要求用户输入姓氏,因为此时该字段是可选的。 如果lastname=models.charfield (null=true),那么就意味着,如果该字段没有从用户那里获得任何值,则它将作为空字符串 " " 存储在数据库中。


3

Null是纯粹与数据库相关,而空白(blank)则与验证相关。如果一个字段设置了blank=True,那么在Django的管理界面上,验证会允许输入空值。如果一个字段设置了blank=False,则该字段将是必填项。


3
简单的答案是:Null用于数据库表,而Blank用于Django表单。

3
Blank=False # this field is required.
Null=False # this field should not be null

Blank=True # this field is optional.
Null=True # Django uses empty string (''), not NULL.

注意:避免在基于字符串的字段,如CharFieldTextFieldFileField/ImageField上使用 null=True

参考文献: Django nullDjango blank


2

简单来说,

空白与空值是不同的。

空值(null)纯粹与数据库相关的,而空白(blank) 是与验证相关的(在表单中必填)。

如果null=True,Django将在数据库中将空值存储为NULL。如果一个字段有blank=True,表单验证将允许输入空值。如果一个字段有blank=False,则该字段是必填的。


2
null=Trueblank=True是django.db.models中的字段属性。null与数据库相关,而blank与验证相关。

null

默认情况下为null=False。如果为null=False,则Django将不允许在数据库列中使用NULL值。

如果为null=True,则Django将在数据库列中将空值存储为NULL。对于CharField和TextField,Django将使用空字符串''代替NULL。请避免为CharField和TextField使用null属性。唯一的例外是当CharField具有unique=Trueblank=True时,需要使用null=True

blank

默认情况下为blank=False。如果为blank=False,则该字段将是必填项。

如果为blank=True,则该字段是可选的,可以留空。当blank=True且null=False时,需要在模型上实现clean()以编程方式设置任何缺失的值。


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