在django中区分null = True,blank = True
当我们在django中添加数据库字段时,我们通常会编写models.CharField(max_length=100, null=True, blank=True)
。 与ForeignKey
, DecimalField
等完成相同的是有什么基本的区别
-
null=True
仅为null=True
-
blank=True
仅为blank=True
-
null=True
,blank=True
关于不同的( CharField
, ForeignKey
, ManyToManyField
, DateTimeField
)字段。 使用1/2/3有什么优点/缺点?
null=True
在数据库中的列上设置NULL
(与NOT NULL
)。 Django字段types(如DateTimeField
或ForeignKey
空白值将在数据库中作为NULL
存储。
blank=True
决定了表单中是否需要该字段。 这包括pipe理员和您自己的自定义表单。 如果blank=True
那么该字段将不是必需的,而如果它是False
的字段不能是空白的。
两者的组合非常频繁,因为通常情况下,如果您要允许表单中的字段为空,则还需要数据库允许该字段为NULL
值。 CharField
和TextField
是个例外,它们在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
CHAR
和TEXT
types不会被Django保存为NULL
,所以null=True
是不必要的。 但是,您可以手动将其中一个字段设置为None
以强制将其设置为NULL
。 如果你有一个可能需要的场景,你应该仍然包含null=True
。
这是如何为Django 1.8映射blank
和null
字段
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的字段(如CharField
和TextField
上使用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保存到数据库列。