当我们在django中添加一个数据库字段时,我们通常会写models.CharField(max_length = 100,null = True,blank = True)
。用ForeignKey
,DecimalField
做同样的事情。有什么基本的区别在于
null = True
onlyblank = True
onlynull = True
,blank = True
关于不同的(CharField
,ForeignKey
,ManyToManyField
,DateTimeField
)字段。使用1/2/3有什么优点/缺点?
在数据库中的列上设置NULL
(而不是NOT NULL
)。 Django字段类型(如DateTimeField
或ForeignKey
)的空值将作为NULL
存储在DB中。
blank = True
决定了表单中是否需要该字段。这包括管理员和您自己的自定义表单。如果blank = True
那么这个字段不是必需的,而如果是False
,那么这个字段不能是空白的。
这两者的组合非常频繁,因为通常情况下,如果您要允许表单中的某个字段为空,则还需要您的数据库允许NULL
值该领域。例外是CharField
和TextField
,它们在Django中永远不会保存为NULL
。空值作为空字符串存储在数据库中('
)。
几个例子:
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
,但通过类似shell的方式处理对象时是可选的。)
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
。
这是ORM如何映射blank
& Django 1.8的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
)