differentiate null=True, blank=True in django
当我们在django中添加数据库字段时,通常会编写
对于不同的(
的组合的两个是如此频繁,因为typically如果你是要去允许一场空白是在你的形态,你是要去也需要你的数据库的允许值
几个例子: </P >
1 2 3 | models.DateTimeField(blank=True) # raises IntegrityError if blank models.DateTimeField(null=True) # NULL allowed, but must be filled out in a form |
双obviously那些选择不做逻辑意识到使用(虽然,有可能是一个使用案例的方法
1 2 3 | models.CharField(blank=True) # No problem, blank is stored as '' models.CharField(null=True) # NULL allowed, but will never be set as NULL |
这是如何的ORM映射
1 2 3 4 5 6 7 8 9 10 11 12 | 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 </P >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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 </P >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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 ) |
AS说在Django模型场参考链接: </P > 场的选项
下面的arguments是可用的所有类型的字段。全是可选的。 </P >
</P >
如果
避免使用
用两串型和非字符串型的字段,你将也需要
Note
When using the Oracle database backend, the value NULL will be stored to denote the empty string regardless of this attribute
</P >
如果
值得注意的是,这是不同的比
简
当查看django模型定义中的选项时,重要的是要了解它们至少有两个用途:定义数据库表,定义默认格式和验证模型表单。(我之所以说"默认",是因为这些值总是可以通过提供自定义表单来覆盖。)一些选项会影响数据库,一些选项会影响表单,有些选项会同时影响这两者。
当涉及到
null=False 和blank=False :这是默认配置,意味着在所有情况下都需要该值。null=True 和blank=True :这意味着字段在所有情况下都是可选的。(如下文所述,但这不是使基于字符串的字段可选的建议方法。)null=False 和blank=True :这意味着表单不需要值,但数据库需要。这有许多用例:此配置最常用于基于字符串的可选字段。如文档中所述,django习惯用法是使用空字符串来表示缺少的值。如果
null 也被允许,那么您将以两种不同的方式来表示缺少的值。另一种常见情况是,您希望根据另一个字段的值自动计算一个字段(例如,在您的
save() 方法中)。您不希望用户以某种形式提供值(因此,blank=True ),但希望数据库强制始终提供值(null=False )。此配置的另一个用途是当您希望指示
ManyToManyField 是可选的时。因为这个字段是作为一个单独的表而不是数据库列实现的,所以null 毫无意义。但是,EDOCX1[1]的值仍然会影响表单,控制没有关系时验证是否成功。
null=True 、blank=False :这意味着表单需要一个值,但数据库不需要。这可能是最不常用的配置,但也有一些使用案例:要求用户始终包含一个值是完全合理的,即使您的业务逻辑实际上并不需要它。毕竟,表单只是添加和编辑数据的一种方式。您可能有生成数据的代码,这些代码不需要像您希望人工编辑器那样严格的验证。
我看到的另一个用例是当你有一个
ForeignKey 时,你不希望允许级联删除。也就是说,在正常使用中,关系应该总是存在的(blank=False ),但是如果它指向的内容碰巧被删除,您也不希望删除该对象。在这种情况下,您可以使用null=True 和on_delete=models.SET_NULL 来实现一种简单的软删除。
然而,直到今天,你可能还没有答案,很难判断是否将空=真或空=真或两者都输入到一个字段中。我个人认为向开发人员提供这么多的选项是非常无用和混乱的。让句柄处理空值或空白,不管它们想要什么。
我跟这张桌子走:。
这是一个以《场与
描述models.textfield(= =真的空白,空= true) </P >
在这个案例:
和 </P >
1 | null = True |
意味着对于要填充的字段没有数据库约束,因此可以为具有此选项的filled设置一个值为空的对象。
1 | blank = True |
意味着Django表单中没有验证约束。因此,当您为这个模型填充一个
有一点,即使是在
换句话说,如果在Django中有一个唯一的char/textfield,则需要使用它:
1 | models.CharField(blank=True, null=True, unique=True) |
对于非唯一的charfield或textfield,最好不要跳过
这里是
1 | date = models.DateTimeField(null=True) |
1 2 | epic = models.ForeignKey(null=True, blank=True) // The exception is CharFields() and TextFields(), which in Django are never saved as NULL. Blank values a |
我想你可能对将空的、可以为空的charfield保存为空,而不是空字符串。关于这一点有很多讨论,并且可能会遇到一个非常实际的问题(例如,您希望为每个用户添加一个OpenID URL,该URL可以为空,并且应该是唯一的)。
当我们在django admin中保存任何内容时,会在django级别和数据库级别进行两个步骤的验证。无法在数字字段中保存文本。
数据库的数据类型为空,这不是什么。当django在数据库中创建列时,它指定它们不能为空。如果你试图保存空值,你会得到数据库错误。
另外,在django管理级别,默认情况下所有字段都是必需的,您不能保存空白字段,django将向您抛出一个错误。
所以,如果您想保存空白字段,您需要在django和数据库级别上允许它。空白=真-将允许管理面板中的空字段空=真-将允许将空保存到数据库列。