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

新手上路,请多包涵

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

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

ForeignKeyDecimalField 等也是如此。它们之间的基本区别是什么:

  1. null=True
  2. blank=True 只有
  3. null=Trueblank=True

关于不同的( CharFieldForeignKeyManyToManyFieldDateTimeField )使用选项 1、2 或 3 的优点/缺点是什么?

原文由 user993563 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 627
2 个回答

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

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

两者的组合是如此频繁,因为通常如果您要允许表单中的字段为空白,您还需要您的数据库允许该字段的 NULL 值。例外是 CharField s 和 TextField s,它们在 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 如果您希望表单中始终需要一个字段,在通过类似的方式处理对象时是可选的贝壳。)

 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

原文由 Chris Pratt 发布,翻译遵循 CC BY-SA 4.0 许可协议

这就是 Django 1.8 的 ORM 映射 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
)

原文由 user 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题