当我们在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有哪些优点/缺点?
#1楼
这是ORM如何为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创建的数据库字段是:
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
)
#2楼
如Django模型字段参考中所述: 链接
栏位选项
以下参数可用于所有字段类型。 所有都是可选的。
null
Field.null
如果为True
,Django将在数据库中将空值存储为NULL
。 默认值为False
。避免在基于字符串的字段(例如
CharField
和TextField
上使用null
,因为空字符串值将始终存储为空字符串,而不是NULL
。 如果基于字符串的字段具有null=True
,则意味着它具有“无数据”的两个可能值:NULL
和空字符串。 在大多数情况下,为“无数据”设置两个可能的值是多余的。 Django约定是使用空字符串,而不是NULL
。对于基于字符串的字段和基于非字符串的字段,如果您希望允许表单中的空值,则还需要设置
blank=True
,因为null
参数仅影响数据库存储(请参见blank
)。注意
使用Oracle数据库后端时,无论此属性如何,都将存储值NULL表示空字符串
blank
Field.blank
如果为
True
,则该字段允许为空白。 默认值为False
。请注意,这不同于
null
。null
纯粹是与数据库有关的,而blank
是与验证有关的。 如果字段具有blank=True
,则表单验证将允许输入空值。 如果字段具有blank=False
,那么将需要该字段。
#3楼
只是null=True
定义数据库应接受NULL
值,另一方面, blank=True
定义在表单验证时此字段应接受或不接受空白值(如果blank=True
则接受该字段中没有值的表单,而blank=False
[默认值]在表单验证中将显示此字段为必填错误。
null=True/False
与数据库有关的null=True/False
blank=True/False
与表单验证有关的blank=True/False
#4楼
这是具有blank= True
和null=True
的字段的示例
description = models.TextField(blank = True,null = True)
在这种情况下: blank = True
:告诉我们的表单可以将描述字段保留为空白
和
null = True
:告诉我们的数据库可以在db字段中记录一个空值并且不给出错误。
#5楼
当我们在Django admin中保存任何内容时,将在Django级别和数据库级别进行两步验证。 我们无法在数字字段中保存文本。
数据库的数据类型为NULL,没什么。 当Django在数据库中创建列时,它指定它们不能为空。 而且,如果您尝试保存NULL,则会出现数据库错误。
同样在Django-Admin级别,默认情况下所有字段都是必填字段,您无法保存空白字段,Django会抛出错误。
因此,如果要保存空白字段,则需要在Django和数据库级别允许它。 blank = True-将允许管理面板中的空字段null = True-将允许将NULL保存到数据库列。
#6楼
至关重要的是要了解Django模型字段定义中的选项至少有两个作用:定义数据库表,定义默认格式和验证模型形式。 (我之所以说“默认值”,是因为可以始终通过提供自定义表单来覆盖这些值。)某些选项影响数据库,某些选项影响表单,而某些选项同时影响这两种形式。
说到null
和blank
,其他答案已经明确表明,前者影响数据库表定义,而后者影响模型验证。 我认为,通过查看所有四种可能配置的用例,可以使区分更加清楚:
null=False
,blank=False
:这是默认配置,表示在所有情况下都需要该值。null=True
,blank=True
:这意味着该字段在所有情况下都是可选的。 (但是,如下所述,这不是使基于字符串的字段为可选的推荐方法。)null=False
,blank=True
:这意味着表单不需要值,但是数据库需要。 有许多用例:null=True
,blank=False
:这意味着表单需要一个值,但是数据库不需要。 这可能是最不常用的配置,但是有一些用例:
#7楼
我认为您可能对将空的可为空的CharField保存为null而不是空字符串感兴趣。 关于此的讨论很多,您可能会遇到一个非常实际的问题(例如,您想为每个用户添加一个openid URL,该URL可以为null,并且应该是唯一的)。
#8楼
null = True
意味着对于要填充的字段没有数据库的约束,因此您可以拥有一个具有空值的对象,该对象具有此选项。
blank = True
意味着没有django形式的验证约束。 因此,当您为此模型填写一个modelForm
时,可以不填写此选项。
#9楼
这是null=True
和blank=True
的主要区别:
null
和blank
的默认值为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
#10楼
有一点,即使在CharField
或TextField
上也需要null=True
,这就是数据库为列设置了unique
标志的时候。
换句话说,如果您在Django中具有唯一的Char / TextField,则需要使用以下代码:
models.CharField(blank=True, null=True, unique=True)
对于非唯一CharField或TextField,最好跳过null=True
否则某些字段将被设置为NULL,而另一些字段将被设置为“”,并且您每次都必须检查字段值是否为NULL。
#11楼
您可能有答案,但是直到今天,仍然很难判断是否将null = True或blank = True或两者都放在一个字段中。 我个人认为为开发人员提供这么多的选择是没有用的,而且令人困惑。 让句柄根据需要为空或空格。
#12楼
对于NULL == TRUE
The default value of both null and blank is False. Both of these values work
at field level i.e., whether we want to keep a field null or blank.
null=True will set the field’s value to NULL i.e., no data. It is
basically for the databases column value.
date = models.DateTimeField(null=True)
对于BLANK == TRUE
blank=True determines whether the field will be required in forms. This
includes the admin and your own custom forms.
title = models.CharField(blank=True) // title can be kept blank. In the
database ("") will be stored.
如果您认为有帮助,请点击
#13楼
null和blank的默认值为False。
空:与数据库有关。 定义给定的数据库列是否将接受空值。
空白:与验证相关。 调用form.is_valid()时,将在表单验证期间使用它。
话虽这么说,具有null = True和blank = False的字段是完全可以的。 在数据库级别上,该字段可以为NULL,但是在应用程序级别上,它是必填字段。
现在,大多数开发人员都将其弄错了:为基于字符串的字段(如CharField和TextField)定义null = True。 避免这样做。 否则,您最终将获得两个可能的“无数据”值,即: 无和空字符串。 为“无数据”设置两个可能的值是多余的。 Django约定是使用空字符串,而不是NULL。
#14楼
null是数据库和空白是字段的验证要显示在文本框一样的用户界面得到的人的姓氏。 如果lastname = models.charfield(blank = true),则没有要求用户输入姓氏,因为这是可选字段。 如果lastname = models.charfield(null = true),则意味着如果该字段未从用户那里获取任何值,则它将作为空字符串“”存储在数据库中。
#15楼
null=True
在数据库的列上设置NULL
(与NOT NULL
)。 Django字段类型(如DateTimeField
或ForeignKey
空白值将作为NULL
存储在数据库中。
blank=True
确定是否需要表单中的字段。 这包括管理员和您自己的自定义表单。 如果blank=True
则不需要该字段,而如果为False
,则该字段不能为空白。
两者的组合是如此频繁,因为通常如果您要允许表单中的字段为空白,则还需要数据库以允许该字段的NULL
值。 CharField
和TextField
是一个例外,在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永远不会将CHAR
和TEXT
类型保存为NULL
,因此null=True
是不必要的。 但是,您可以将这些字段之一手动设置为None
以强制将其设置为NULL
。 如果您有可能需要这样做的情况,则仍应包含null=True
。