关于Python:在django中区分null = True,blank = True

differentiate null=True, blank=True in django

当我们在django中添加数据库字段时,通常会编写models.CharField(max_length=100, null=True, blank=True)。对ForeignKeyDecimalField等也有同样的作用。有什么基本区别?

  • 仅限null=True
  • 仅限blank=True
  • null=Trueblank=True
  • 对于不同的(CharFieldForeignKeyManyToManyFieldDateTimeField字段。使用1/2/3有哪些优点/缺点?


    null=TrueNULL(对NOT NULL)对列在你的数据库。空白值用Django场类型,如DateTimeFieldForeignKey将为NULL可存储在数据库中。 </P >

    blank=Truedetermines是否该场将被要求的形式。这包括在行政和你自己的定制的形式。如果blank=True当时的场将不会是所需的,而如果它的False的字段不能是空白的。 </P >

    的组合的两个是如此频繁,因为typically如果你是要去允许一场空白是在你的形态,你是要去也需要你的数据库的允许值NULL这场。例外的是CharFields和TextFields,这在Django是永远不会为救NULL。。。。。。。空白值是可存储在DB为一个空字符串('')。 </P >

    几个例子: </P >

    1
    2
    3
    models.DateTimeField(blank=True) # raises IntegrityError if blank

    models.DateTimeField(null=True) # NULL allowed, but must be filled out in a form

    双obviously那些选择不做逻辑意识到使用(虽然,有可能是一个使用案例的方法null=True, blank=False,如果你想要一个场的总的要求是在形式,但当处理与可选的面向通的壳状的东西。) </P >

    1
    2
    3
    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用Django,SO null=True是不必要的。然而,你可以手动设置的一个,这些领域的None到它作为NULL集力。如果你有一个情景,这可能是必要的,你应该还包括null=True。。。。。。。 </P >


    这是如何的ORM映射blank&;NULL字段用Django 1.8 </P >

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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 </P >

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    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 </P >

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    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
    )


    AS说在Django模型场参考链接: </P > 场的选项

    下面的arguments是可用的所有类型的字段。全是可选的。 </P >

    </P > NULL Field.null

    如果True,Django会存储空值为NULL中的数据库。默认值是False。。。。。。。 </P >

    避免使用NULL是字符串型的字段,如CharFieldTextField因为空的字符串值将永远是可存储为空字符串,而不是作为NULL。。。。。。。如果一个字符串型的字段有null=True,那它有双均值可能的值为"好的数据:"NULL,和空字符串。在大多数案件中,它的磁盘有两个可能的值为"好的数据";在Django的会议是使用空字符串,而不是NULL。。。。。。。 </P >

    用两串型和非字符串型的字段,你将也需要blank=True集,如果你希望到允许空值的形式,为NULL参数affects只读数据库存储(见blank)。 </P >

    Note

    When using the Oracle database backend, the value NULL will be stored to denote the empty string regardless of this attribute

    </P > blank Field.blank

    如果True场是允许的,是空白的。默认值是False。。。。。。。 </P >

    值得注意的是,这是不同的比NULL。。。。。。。NULLpurely数据库是相关的,而blank验证是相关的。如果有一场blank=True形态,验证将允许出入一个空值。如果有一场blank=False,本场将是需要的。 </P >


    null=Truedefines数据库应该接受NULL值,其他的手blank=Truedefines形态是验证这场空白值应接受或不接受它(如果blank=True形态不一的价值在这场和blank=False[默认]是价值形态的验证它将这场演出的要求是错误的。 </P >

    null=True/False相关的数据库 </P >

    blank=True/False形态相关的验证 </P >


    当查看django模型定义中的选项时,重要的是要了解它们至少有两个用途:定义数据库表,定义默认格式和验证模型表单。(我之所以说"默认",是因为这些值总是可以通过提供自定义表单来覆盖。)一些选项会影响数据库,一些选项会影响表单,有些选项会同时影响这两者。

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

    • null=Falseblank=False:这是默认配置,意味着在所有情况下都需要该值。

    • null=Trueblank=True:这意味着字段在所有情况下都是可选的。(如下文所述,但这不是使基于字符串的字段可选的建议方法。)

    • null=Falseblank=True:这意味着表单不需要值,但数据库需要。这有许多用例:

      • 此配置最常用于基于字符串的可选字段。如文档中所述,django习惯用法是使用空字符串来表示缺少的值。如果null也被允许,那么您将以两种不同的方式来表示缺少的值。

      • 另一种常见情况是,您希望根据另一个字段的值自动计算一个字段(例如,在您的save()方法中)。您不希望用户以某种形式提供值(因此,blank=True),但希望数据库强制始终提供值(null=False)。

      • 此配置的另一个用途是当您希望指示ManyToManyField是可选的时。因为这个字段是作为一个单独的表而不是数据库列实现的,所以null毫无意义。但是,EDOCX1[1]的值仍然会影响表单,控制没有关系时验证是否成功。

    • null=Trueblank=False:这意味着表单需要一个值,但数据库不需要。这可能是最不常用的配置,但也有一些使用案例:

      • 要求用户始终包含一个值是完全合理的,即使您的业务逻辑实际上并不需要它。毕竟,表单只是添加和编辑数据的一种方式。您可能有生成数据的代码,这些代码不需要像您希望人工编辑器那样严格的验证。

      • 我看到的另一个用例是当你有一个ForeignKey时,你不希望允许级联删除。也就是说,在正常使用中,关系应该总是存在的(blank=False),但是如果它指向的内容碰巧被删除,您也不希望删除该对象。在这种情况下,您可以使用null=Trueon_delete=models.SET_NULL来实现一种简单的软删除。


    然而,直到今天,你可能还没有答案,很难判断是否将空=真或空=真或两者都输入到一个字段中。我个人认为向开发人员提供这么多的选项是非常无用和混乱的。让句柄处理空值或空白,不管它们想要什么。

    我跟这张桌子走:enter image description here

    enter image description here


    这是一个以《场与blank= Truenull=True </P >

    描述models.textfield(= =真的空白,空= true) </P >

    在这个案例: blank = Truetells:我们的形态,这是很好的描述场的空白离开 </P >

    和 </P >

    null = Truetells:我们的数据库,它是很好的一个空值记录在我们的数据库字段不给我的错误。 </P >


    1
    null = True

    意味着对于要填充的字段没有数据库约束,因此可以为具有此选项的filled设置一个值为空的对象。

    1
    blank = True

    意味着Django表单中没有验证约束。因此,当您为这个模型填充一个modelForm时,您可以让字段中没有填充这个选项。


    有一点,即使是在CharFieldTextField上,null=True也是必需的,那就是当数据库为该列设置了unique标志时。

    换句话说,如果在Django中有一个唯一的char/textfield,则需要使用它:

    1
    models.CharField(blank=True, null=True, unique=True)

    对于非唯一的charfield或textfield,最好不要跳过null=True,否则一些字段将被设置为空,而其他字段将被设置为",并且每次都必须检查字段值是否为空。


    这里是null=Trueblank=True的主要区别:

    nullblank的默认值都是错误的。这两个值都在字段级别上工作,即,我们是希望保留字段null还是blank

    null=True将字段值设置为null即没有数据。基本上是数据库列值。

    1
    date = models.DateTimeField(null=True)

    blank=True决定表单中是否需要该字段。这包括管理员和您自己的自定义表单。

    title = models.CharField(blank=True) // title can be kept blank.在数据库中,将存储("")null=Trueblank=True这意味着该字段在所有情况下都是可选的。

    1
    2
    epic = models.ForeignKey(null=True, blank=True)
    // The exception is CharFields() and TextFields(), which in Django are never saved as NULL. Blank values a

    我想你可能对将空的、可以为空的charfield保存为空,而不是空字符串。关于这一点有很多讨论,并且可能会遇到一个非常实际的问题(例如,您希望为每个用户添加一个OpenID URL,该URL可以为空,并且应该是唯一的)。


    当我们在django admin中保存任何内容时,会在django级别和数据库级别进行两个步骤的验证。无法在数字字段中保存文本。

    数据库的数据类型为空,这不是什么。当django在数据库中创建列时,它指定它们不能为空。如果你试图保存空值,你会得到数据库错误。

    另外,在django管理级别,默认情况下所有字段都是必需的,您不能保存空白字段,django将向您抛出一个错误。

    所以,如果您想保存空白字段,您需要在django和数据库级别上允许它。空白=真-将允许管理面板中的空字段空=真-将允许将空保存到数据库列。