区分 null = True,空白 = True in django

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

答案

null=True在数据库的列上设置NULL (与NOT NULL )。 Django 字段类型(例如DateTimeFieldForeignKey空白值将作为NULL存储在数据库中。

blank=True确定是否需要表单中的字段。这包括管理员和您自己的自定义表单。如果blank=True则不需要该字段,而如果为False ,则该字段不能为空白。

两者的组合是如此频繁,因为通常如果您要允许表单中的字段为空白,则还需要数据库以允许该字段的NULL值。 CharFieldTextField是一个例外,在 Django 中从不将其保存为NULL 。空白值被存储在 DB 中作为空字符串( '' )。

一些例子:

models.DateTimeField(blank=True) # raises IntegrityError if blank

models.DateTimeField(null=True) # NULL allowed, but must be filled out in a form

显然,这两个选项在使用上没有逻辑上的意义(不过,如果您希望始终在表单中使用字段,则可能存在null=True, blank=False的用例,但是在通过某种方式处理对象时是可选的)像外壳一样。)

models.CharField(blank=True) # No problem, blank is stored as ''

models.CharField(null=True) # NULL allowed, but will never be set as NULL

Django 永远不会将CHARTEXT类型保存为NULL ,因此null=True是不必要的。但是,您可以将这些字段之一手动设置为None以强制将其设置为NULL 。如果您有可能需要这样做的情况,则仍应包括null=True

这是 ORM 如何为 Django 1.8 映射blanknull字段

class Test(models.Model):
    charNull        = models.CharField(max_length=10, null=True)
    charBlank       = models.CharField(max_length=10, blank=True)
    charNullBlank   = models.CharField(max_length=10, null=True, blank=True)

    intNull         = models.IntegerField(null=True)
    intBlank        = models.IntegerField(blank=True)
    intNullBlank    = models.IntegerField(null=True, blank=True)

    dateNull        = models.DateTimeField(null=True)
    dateBlank       = models.DateTimeField(blank=True)
    dateNullBlank   = models.DateTimeField(null=True, blank=True)

PostgreSQL 9.4创建的数据库字段是:

CREATE TABLE Test (
  id              serial                    NOT NULL,

  "charNull"      character varying(10),
  "charBlank"     character varying(10)     NOT NULL,
  "charNullBlank" character varying(10),

  "intNull"       integer,
  "intBlank"      integer                   NOT NULL,
  "intNullBlank"  integer,

  "dateNull"      timestamp with time zone,
  "dateBlank"     timestamp with time zone  NOT NULL,
  "dateNullBlank" timestamp with time zone,
  CONSTRAINT Test_pkey PRIMARY KEY (id)
)

MySQL 5.6创建的数据库字段是:

CREATE TABLE Test (
     `id`            INT(11)     NOT  NULL    AUTO_INCREMENT,

     `charNull`      VARCHAR(10) NULL DEFAULT NULL,
     `charBlank`     VARCHAR(10) NOT  NULL,
     `charNullBlank` VARCHAR(10) NULL DEFAULT NULL,

     `intNull`       INT(11)     NULL DEFAULT NULL,
     `intBlank`      INT(11)     NOT  NULL,
     `intNullBlank`  INT(11)     NULL DEFAULT NULL,

     `dateNull`      DATETIME    NULL DEFAULT NULL,
     `dateBlank`     DATETIME    NOT  NULL,
     `dateNullBlank` DATETIME    NULL DEFAULT NULL
)

如 Django 模型字段参考中所述: 链接

栏位选项

以下参数可用于所有字段类型。所有都是可选的。


null

Field.null

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

避免在基于字符串的字段(例如CharFieldTextField上使用null ,因为空字符串值将始终存储为空字符串,而不是NULL 。如果基于字符串的字段具有null=True ,则意味着它具有 “无数据” 的两个可能值: NULL和空字符串。在大多数情况下,为 “无数据” 设置两个可能的值是多余的。 Django 约定是使用空字符串,而不是NULL

对于基于字符串的字段和基于非字符串的字段,如果您希望允许表单中的空值,则还需要设置blank=True ,因为null参数仅影响数据库存储(请参见blank )。

注意

使用 Oracle 数据库后端时,无论此属性如何,都将存储值 NULL 表示空字符串


blank

Field.blank

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

请注意,这不同于nullnull纯粹是与数据库有关的,而blank是与验证有关的。如果字段具有blank=True ,则表单验证将允许输入一个空值。如果字段具有blank=False ,那么将需要该字段。

理解 Django 模型字段定义中的选项至少有两个作用是至关重要的:定义数据库表,定义默认格式和验证模型形式。 (我之所以说 “默认值”,是因为始终可以通过提供自定义表单来覆盖这些值。)某些选项影响数据库,某些选项影响表单,而某些选项同时影响这两种形式。

当涉及nullblank ,其他答案已经清楚地表明,前者影响数据库表定义,而后者影响模型验证。我认为,通过查看所有四种可能配置的用例,可以使区分更加清楚:

  • null=Falseblank=False :这是默认配置,表示在所有情况下都需要该值。

  • null=Trueblank=True :这意味着该字段在所有情况下都是可选的。 (但是,如下所述,这不是使基于字符串的字段为可选的推荐方法。)

  • null=Falseblank=True :这意味着表单不需要值,但是数据库需要。有许多用例:

    • 最常见的用途是用于基于字符串的可选字段。如文档中所述 ,Django 习惯用法是使用空字符串表示缺少的值。如果还允许使用NULL则最终将以两种不同的方式指示缺失值。

    • 另一个常见的情况是您想根据另一个字段的值自动计算一个字段(例如,在save()方法中)。您不希望用户以某种形式提供值(因此, blank=True ),但是您希望数据库强制始终提供值( null=False )。

    • 另一个用途是当您想要指示ManyToManyField是可选的时。因为此字段是作为单独的表而不是数据库列实现的,所以null毫无意义 。但是, blank的值仍会影响表单,控制在没有关系时验证是否成功。

  • null=Trueblank=False :这意味着表单需要一个值,但数据库不需要。这可能是最不常用的配置,但是有一些用例:

    • 要求用户始终包含一个值是完全合理的,即使您的业务逻辑实际上并不需要它也是如此。毕竟,表单只是添加和编辑数据的一种方式。您可能拥有的代码生成的数据不需要与人工编辑器一样严格的验证。

    • 我看到的另一个用例是当您有一个不希望对其进行级联删除ForeignKey时。也就是说,在正常使用中,该关系应始终存在( blank=False ),但是如果它指向的对象恰好被删除,则您也不想删除该对象。在这种情况下,可以使用null=Trueon_delete=models.SET_NULL来实现一种简单的软删除

只是null=True定义数据库应接受NULL值,另一方面, blank=True定义在表单验证时此字段应接受或不接受空白值(如果blank=True则接受该字段中没有值的表单,而blank=False [默认值] 在表单验证中将显示此字段为必填错误。

null=True/False与数据库有关的null=True/False

blank=True/False与表单验证有关的blank=True/False

您可能有答案,但是直到今天,仍然很难判断是否将 null = True 或 blank = True 或两者都放在一个字段中。我个人认为为开发人员提供这么多的选择是没有用的,而且令人困惑。让空处理或空处理成为所需。

我遵循这张表,来自Django 的两个独家新闻在此处输入图片说明

该表显示了何时对每种字段类型使用null或空白

这是具有blank= Truenull=True的字段的示例

description = models.TextField(blank = True,null = True)

在这种情况下: blank = True :告诉我们的表单可以将描述字段保留为空白

null = True :告诉我们的数据库可以在 db 字段中记录一个空值并且不给出错误。

null = True

意味着对于要填充的字段没有数据库的约束,因此您可以拥有一个具有空值的对象,该对象具有此选项。

blank = True

意味着没有 Django 形式的验证约束。因此,当您为此模型填写modelForm时,可以不填写此选项。

这是null=Trueblank=True的主要区别:

nullblank的默认值为 False。这两个值都在字段级别起作用,即我们要保持字段null还是blank

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

date = models.DateTimeField(null=True)

blank=True确定是否需要表单中的字段。这包括管理员和您自己的自定义表单。

title = models.CharField(blank=True) // title can be kept blank.在数据库中("")将被存储。 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

当我们在 Django admin 中保存任何内容时,将在 Django 级别和数据库级别进行两步验证。我们无法在数字字段中保存文本。

数据库的数据类型为 NULL,没什么。当 Django 在数据库中创建列时,它指定它们不能为空。而且,如果您尝试保存 NULL,则会出现数据库错误。

同样在 Django-Admin 级别上,默认情况下所有字段都是必填字段,您无法保存空白字段,Django 会抛出错误。

因此,如果要保存空白字段,则需要在 Django 和数据库级别允许它。 blank = True - 将允许管理面板中的空字段 null = True - 将允许将 NULL 保存到数据库列。