在Django中,null=True和blank=True有什么区别?

58 浏览
0 Comments

在Django中,null=True和blank=True有什么区别?

想要改进这篇文章吗? 提供详细的问题答案,包括引用并解释为什么你的答案是正确的。没有足够细节的答案可能会被编辑或删除。

当我们在 Django 中添加一个模型字段时,通常会写:

models.CharField(max_length=100, null=True, blank=True)

对于不同的字段(CharFieldForeignKeyManyToManyFieldDateTimeField),使用以下方式有什么基本区别:

  1. 只有 null=True
  2. 只有 blank=True
  3. 同时使用 null=Trueblank=True

使用选项 1、2 或 3 的优缺点是什么?

admin 更改状态以发布 2023年5月23日
0
0 Comments

这是ORM在Django 1.8中如何映射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
)

0
0 Comments

null=True 在数据库的列上设置 NULL(而不是 NOT NULL)。对于 Django 字段类型(例如 DateTimeFieldForeignKey)的空值,将以 NULL 的形式存储在数据库中。

blank 决定了字段是否在表单中必须填写。这包括管理员和您的自定义表单。如果 blank=True,则该字段不是必填项,否则如果为 False,则该字段不能是空的。

两者的组合非常常见,因为通常如果您想在表单中允许一个字段为空,您也需要让数据库允许该字段的空值。例外情况是 Django 中的 CharFieldTextField,它们从不保存为 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

CHARTEXT 类型从不保存为 Django 的 NULL,因此 null=True 是不必要的。但是,您可以将其中一个字段手动设置为 None,以强制将其设置为 NULL。如果您有可能需要这样做的情况,仍应包括 null=True

0