在Django中,null=True和blank=True有什么区别?
在Django中,null=True和blank=True有什么区别?
想要改进这篇文章吗? 提供详细的问题答案,包括引用并解释为什么你的答案是正确的。没有足够细节的答案可能会被编辑或删除。
当我们在 Django 中添加一个模型字段时,通常会写:
models.CharField(max_length=100, null=True, blank=True)
对于不同的字段(CharField
、ForeignKey
、ManyToManyField
、DateTimeField
),使用以下方式有什么基本区别:
- 只有
null=True
- 只有
blank=True
- 同时使用
null=True
和blank=True
使用选项 1、2 或 3 的优缺点是什么?
这是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 )
null=True
在数据库的列上设置 NULL
(而不是 NOT NULL
)。对于 Django 字段类型(例如 DateTimeField
或 ForeignKey
)的空值,将以 NULL
的形式存储在数据库中。
blank
决定了字段是否在表单中必须填写。这包括管理员和您的自定义表单。如果 blank=True
,则该字段不是必填项,否则如果为 False
,则该字段不能是空的。
两者的组合非常常见,因为通常如果您想在表单中允许一个字段为空,您也需要让数据库允许该字段的空值。例外情况是 Django 中的 CharField
和 TextField
,它们从不保存为 NULL
。空白值在数据库中存储为空字符串 (''
)。
以下是一些示例:
models.DateTimeField(blank=True) # raises IntegrityError if blank models.DateTimeField(null=True) # NULL allowed, but must be filled out in a form
显然,这两个选项在逻辑上没有意义(虽然如果您希望在表单中始终需要一个字段,在通过类似于 Shell 的对象处理时可以选择可选的 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
类型从不保存为 Django 的 NULL
,因此 null=True
是不必要的。但是,您可以将其中一个字段手动设置为 None
,以强制将其设置为 NULL
。如果您有可能需要这样做的情况,仍应包括 null=True
。