python – 在django中区分null = True,blank = True

当我


们在django中添加数据库字段时,我们通常会写models.CharField(max_length=100, null=True, blank=True)。同样是用ForeignKeyDecimalField等等。有什么基本的区别

  1. null=True 只要
  2. blank=True 只要
  3. null=True, blank=True

在相对于不同的(CharFieldForeignKeyManyToManyFieldDateTimeField)字段。使用1/2/3有哪些优点/缺点?


null=True在数据库中的列上设置NULL(对比NOT NULL)。Django字段类型的空值,例如DateTimeFieldForeignKey将存储NULL在DB中。

blank=True确定表单中是否需要该字段。这包括管理员和您自己的自定义表单。如果blank=True那时不需要该字段,而如果False该字段不能为空。

两者的组合非常频繁,因为通常如果您要允许表单中的字段为空,那么您还需要使用数据库来允许NULL该字段的值。例外是CharFields和TextFields,它们在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如果您希望在表单中始终需要字段,则可能有一个用例,但在通过类似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类型永远不会NULL被Django 保存,因此null=True是不必要的。但是,您可以手动设置其中一个字段None以强制将其设置为NULL。如果你有一个可能需要的场景,你仍然应该包括null=True


这就是Django 1.8 的ORM映射blanknull字段

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
)

如Django模型字段中所述:链接

现场选择

以下参数可用于所有字段类型。一切都是可选的。

null

Field.null

如果True,Django将NULL在数据库中存储空值。默认是False

避免null在基于字符串的字段上使用,例如CharFieldTextField因为空字符串值将始终存储为空字符串,而不是NULL。如果基于字符串的字段具有null=True,则表示它具有“无数据”的两个可能值:NULL和空字符串。在大多数情况下,为“无数据”提供两个可能的值是多余的; Django约定是使用空字符串,而不是NULL

对于基于字符串和非基于字符串的字段,您还需要设置blank=True是否允许在表单中允许空值,因为该null参数仅影响数据库存储(请参阅参考资料blank)。

注意

使用Oracle数据库后端时,将存储值NULL以表示空字符串,而不管此属性如何

blank

Field.blank 

如果True,该字段允许为空。默认是False

请注意,这不同于nullnull纯粹与数据库相关,而blank与验证相关。如果字段有blank=True,则表单验证将允许输入空值。如果字段有blank=False,则需要该字段。

添加评论

友情链接:蝴蝶教程