为了账号安全,请及时绑定邮箱和手机立即绑定

在Django中区分null=True,space=True

在Django中区分null=True,space=True

白猪掌柜的 2019-07-11 13:08:35
在Django中区分null=True,space=True在Django中添加数据库字段时,通常会编写models.CharField(max_length=100, null=True, blank=True)..同样的事情也发生在ForeignKey, DecimalField有什么基本的区别null=True只blank=True只null=True, blank=True就不同的(CharField, ForeignKey, ManyToManyField, DateTimeField)田野。使用1/2/3的优点/缺点是什么?
查看完整描述

3 回答

?
偶然的你

TA贡献1841条经验 获得超3个赞

null=TrueNULL(相对于NOT NULL)在数据库中的列上。Django字段类型的空白值,如DateTimeFieldForeignKey将作为NULL在数据库里。

blank=True确定表单中是否需要该字段。这包括管理和您自己的自定义表单。如果blank=True那么这个字段就不需要了,但是如果它是False字段不能为空白。

这两者的组合是如此频繁,因为通常情况下,如果要允许一个字段在表单中为空白,则还需要数据库来允许NULL该字段的值。例外是CharFieldS和TextFields,在Django是绝不可能存为NULL..空白值作为空字符串存储在DB中('').

有几个例子:

models.DateTimeField(blank=True) # raises IntegrityError if blankmodels.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

CHARTEXT类型从未保存为NULL贾安戈null=True是不必要的。但是,您可以手动将其中一个字段设置为None强制设置为NULL..如果您有一个可能需要这样做的场景,则仍然应该包括null=True.


查看完整回答
反对 回复 2019-07-11
?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

这就是ORM的地图blank & nullDjango 1.8字段

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)


查看完整回答
反对 回复 2019-07-11
  • 3 回答
  • 0 关注
  • 756 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信