首页 > Python > 在 Django 中 null=True 和 blank=True 有什么区别?

在 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

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

分割线

网友回答:

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

分割线

网友回答:

null=True在数据库中的列上设置(与 )。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

分割线

网友回答:

理解 Django 模型字段定义中的选项(至少)有两个目的是至关重要的:定义数据库表,以及定义模型表单的默认格式和验证。(我说“默认”是因为始终可以通过提供自定义表单来覆盖这些值。有些选项会影响数据库,有些选项会影响表单,有些选项会影响两者。

当涉及到和时,其他答案已经清楚地表明,前者影响数据库表定义,后者影响模型验证。我认为通过查看所有四种可能配置的用例,可以更清楚地区分:nullblank

  • null=False, :这是默认配置,表示在所有情况下都需要该值。blank=False
  • null=True, :这意味着该字段在所有情况下都是可选的。但是,如下所述,这不是使基于字符串的字段成为可选字段的推荐方法。blank=True
  • null=False, :这意味着表单不需要值,但数据库需要。这有许多用例:blank=True
    • 最常见的用途是可选的基于字符串的字段。如文档中所述,Django 惯用法是使用空字符串来指示缺失值。如果还允许,您最终会有两种不同的方法来指示缺失值。(但是,如果该字段也是 ,则必须使用 来防止多个空字符串无法通过唯一性检查。NULLuniquenull=True
    • 另一种常见的情况是,您希望根据另一个字段的值自动计算另一个字段(例如,在您的方法中)。您不希望用户在表单中提供值(因此),但您确实希望数据库强制始终提供值()。save()blank=Truenull=False
    • 另一个用途是当您想要指示 a 是可选的时。因为此字段是作为单独的表而不是数据库列实现的,所以毫无意义。但是,将的值仍会影响表单,控制在没有关系时验证是否成功。ManyToManyFieldnullblank
  • null=True, :这意味着表单需要一个值,但数据库不需要。这可能是最不常用的配置,但有一些用例:blank=False
    • 要求用户始终包含值是完全合理的,即使业务逻辑实际上并不要求该值。毕竟,表单只是添加和编辑数据的一种方式。您可能有生成的代码不需要与人工编辑器相同的严格验证。
    • 我见过的另一个用例是,当您不希望允许级联删除时。也就是说,在正常使用中,关系应该始终存在(),但是如果它指向的内容恰好被删除,则您不希望此对象也被删除。在这种情况下,您可以使用 和 实现一种简单的软删除。ForeignKeyblank=Falsenull=Trueon_delete=models.SET_NULL

模板简介:该模板名称为【在 Django 中 null=True 和 blank=True 有什么区别?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Python】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 204次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 03-16
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
单页式简历模板 html5 响应式 企业网站 自适应 微信文章 微信图片 微信素材 微信模板 微信公众平台
您可能会喜欢的其他模板