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

2022-09-05 01:03:02

当我们在django中添加数据库字段时,我们通常写:

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

等也是如此。具有的基本区别是什么ForeignKeyDecimalField

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

关于不同的 (, , , ) 字段。使用1/2/3的优点/缺点是什么?CharFieldForeignKeyManyToManyFieldDateTimeField


答案 1

null=True在 DB 中的列上设置 (vs. )。Django 字段类型的空白值,如 或 将存储在数据库中。NULLNOT NULLDateTimeFieldForeignKeyNULL

blank确定表单中是否为必填字段。这包括管理员和您的自定义表单。如果,则该字段将不是必需的,而如果是,则该字段不能为空。blank=TrueFalse

两者的结合非常频繁,因为通常如果您要允许在表单中将某个字段留空,则还需要数据库来允许该字段的值。例外是 s 和 s,它们在 Django 中永远不会保存为 。空白值作为空字符串 () 存储在数据库中。NULLCharFieldTextFieldNULL''

举几个例子:

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并且类型永远不会被Django保存,因此是不必要的。但是,您可以手动设置这些字段之一以强制将其设置为 。如果遇到可能需要这样做的情况,则仍应包括 。TEXTNULLnull=TrueNoneNULLnull=True


答案 2

这就是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
)