在django中区分null = True,blank = True

当我们在django中添加数据库字段时,我们通常会编写models.CharField(max_length=100, null=True, blank=True) 。 与ForeignKeyDecimalField等完成相同的是有什么基本的区别

  1. null=True仅为null=True
  2. blank=True仅为blank=True
  3. null=Trueblank=True

关于不同的( CharFieldForeignKeyManyToManyFieldDateTimeField )字段。 使用1/2/3有什么优点/缺点?

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

blank=True决定了表单中是否需要该字段。 这包括pipe理员和您自己的自定义表单。 如果blank=True那么该字段将不是必需的,而如果它是False的字段不能是空白的。

两者的组合非常频繁,因为通常情况下,如果您要允许表单中的字段为空,则还需要数据库允许该字段为NULL值。 CharFieldTextField是个例外,它们在Django中永远不会被保存为NULL 。 空白值作为空string( '' )存储在数据库中。

几个例子:

 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 

CHARTEXTtypes不会被Django保存为NULL ,所以null=True是不必要的。 但是,您可以手动将其中一个字段设置为None以强制将其设置为NULL 。 如果你有一个可能需要的场景,你应该仍然包含null=True

这是如何为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创build的数据库字段是:

 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创build的数据库字段是:

 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模型字段中所说: 链接

字段选项

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

null

Field.null

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

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

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

注意

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

blank

Field.blank

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

请注意,这与null不同。 null与纯数据库相关,而blank与validation有关。 如果一个字段的值为空,则表单validation将允许input一个空值。 如果一个字段具有blank=False ,则该字段将是必需的。

简单地null=True定义数据库应该接受NULL值,另一方面blank=True在表单validation上定义这个字段应该接受空白值或者不接受(如果blank=True它接受在该字段中没有值的表单并且blank=False [默认值]表单validation它将显示此字段是必需的错误。

null=True/False与数据库相关

blank=True/False与表单validation有关

下面是一个空白= true和null = true的字段示例description = models.TextField(blank = True,null = True)

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

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

当我们在Django admin中保存任何东西时,在Django级别和数据库级别上进行两个步骤的validation。 我们无法在数字字段中保存文字。

数据库的数据types为NULL,它什么也没有。 当Django在数据库中创build列时,它指定它们不能为空。 如果你会尝试保存NULL,你会得到数据库错误。

同样在Django的pipe理员级别,所有的字段默认是必需的,你不能保存空白字段,Django会给你一个错误。

所以,如果你想保存空白字段,你需要在Django和数据库级别上允许它。 空白=真 – 将允许pipe理面板中的空字段空= True – 将允许将NULL保存到数据库列。