在django中区分null = True,blank = True

时间:2011-12-22 20:11:04

标签: python django django-models

当我们在django中添加数据库字段时,我们通常会写models.CharField(max_length=100, null=True, blank=True)。使用ForeignKeyDecimalField等也是如此。

的基本区别是什么
    仅限
  1. null=True
  2. 仅限
  3. blank=True
  4. null=Trueblank=True
  5. 针对不同的(CharFieldForeignKeyManyToManyFieldDateTimeField)字段。使用1/2/3有什么优点/缺点?

23 个答案:

答案 0 :(得分:898)

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

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

两者的组合是如此频繁,因为通常如果您要允许表单中的字段为空,那么您还需要您的数据库允许该字段的NULL值。例外是CharFieldTextField 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的用例,但在处理对象时可选像shell这样的东西。)

models.CharField(blank=True) # No problem, blank is stored as ''

models.CharField(null=True) # NULL allowed, but will never be set as NULL
Django永远不会将{p> CHARTEXT类型保存为NULL,因此null=True是不必要的。但是,您可以手动将其中一个字段设置为None,以强制将其设置为NULL。如果您有可能需要的方案,则仍应包含null=True

答案 1 :(得分:94)

这是ORM如何映射blank& Django 1.8的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
)

答案 2 :(得分:34)

如Django模型字段中所述:Link

字段选项

以下参数可用于所有字段类型。所有都是可选的。


null

Field.null

如果True,Django会将空值存储为NULL在数据库中。默认值为False

避免在nullCharField等基于字符串的字段上使用TextField,因为空字符串值将始终存储为空字符串,而不是NULL。如果基于字符串的字段具有null=True,则表示它具有“无数据”的两个可能值:NULL和空字符串。在大多数情况下,为“无数据”提供两个可能的值是多余的; Django约定是使用空字符串,而不是NULL

对于基于字符串和非字符串的字段,如果您希望在表单中允许空值,则还需要设置blank=True,因为null参数仅影响数据库存储(见blank)。

  

注意

     

使用Oracle数据库后端时,无论此属性如何,都将存储值NULL以表示空字符串


blank

Field.blank

如果True,则允许该字段为空。默认值为False

请注意,这与null不同。 null纯粹与数据库相关,而blank与验证相关。如果字段具有blank=True,则表单验证将允许输入空值。如果字段为blank=False,则该字段为必填字段。

答案 3 :(得分:20)

简单null=True定义数据库应接受NULL值,另一方面blank=True定义表单验证此字段应接受空白值(如果blank=True接受表单如果该字段中没有值,并且表单验证中显示blank=False [默认值],则会显示此字段是必需的错误。

与数据库相关的

null=True/False

与表单验证相关的

blank=True/False

答案 4 :(得分:18)

在查看Django模型定义中的选项时,理解它们(至少)有两个目的是至关重要的:定义数据库表,定义模型表单的默认格式和验证。 (我说"默认"因为可以通过提供自定义表单来覆盖值。)有些选项会影响数据库,有些选项会影响表单,有些选项会影响表单。

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

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

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

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

    • 此配置的最常见用途是可选的基于字符串的字段。作为noted in the documentation,Django习惯用法是使用空字符串来表示缺失值。如果还允许NULL,您最终会采用两种不同的方式来表示缺失值。

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

    • 此配置的另一个用途是当您想要指示ManyToManyField是可选的时。因为此字段是作为单独的表而不是数据库列null is meaningless实现的。但是,blank的值仍然会影响表单,控制在没有关系时验证是否会成功。

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

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

    • 我见过的另一个用例就是当你有ForeignKey时,你不希望允许cascade deletion。也就是说,在正常使用中,关系应始终存在(blank=False),但如果它指向的东西恰好被删除,那么您也不希望删除此对象。在这种情况下,您可以使用null=Trueon_delete=models.SET_NULL来实现一种简单的soft deletion

答案 5 :(得分:9)

您可能有答案,但是直到今天,仍然很难判断是否将null = True或blank = True或两者都放在一个字段中。我个人认为为开发人员提供这么多的选择是没有用的,而且令人困惑。让句柄按需要处理空值或空白。

我遵循此表:enter image description here

enter image description here

答案 6 :(得分:7)

以下是blank= Truenull=True

字段的示例

description = models.TextField(blank = True,null = True)

在这种情况下: blank = True:告诉我们表单可以将描述字段留空

null = True:告诉我们的数据库可以在我们的数据库字段中记录空值而不会出错。

答案 7 :(得分:5)

null和blank的默认值为False。

空:与数据库相关。定义给定的数据库列是否接受空值。

空白:与验证相关。调用form.is_valid()时,它将在表单验证期间使用。

话虽这么说,具有null = True和blank = False的字段是完全可以的。在数据库级别上,该字段可以为NULL,但是在应用程序级别上,它是必填字段。

现在,大多数开发人员都会弄错了:为基于字符串的字段(如CharField和TextField)定义null = True。避免这样做。否则,您最终将有两个可能的“无数据”值,即:和一个空字符串。为“无数据”设置两个可能的值是多余的。 Django约定是使用空字符串,而不是NULL。

答案 8 :(得分:3)

    private final static String simSlotName[] = {
        "extra_asus_dial_use_dualsim",
        "com.android.phone.extra.slot",
        "slot",
        "simslot",
        "sim_slot",
        "subscription",
        "Subscription",
        "phone",
        "com.android.phone.DialingMode",
        "simSlot",
        "slot_id",
        "simId",
        "simnum",
        "phone_type",
        "slotId",
        "slotIdx"
   };

这意味着要填充的字段没有数据库的限制,因此可以为该对象提供一个具有空值的对象。

null = True

意味着没有django形式的验证约束。因此,当您为此模型填写blank = True 时,可以不填写此选项。

答案 9 :(得分:3)

Blank=False # this field is required.
Null=False # this field should not be null

Blank=True # this field is optional.
Null=True # Django uses empty string (''), not NULL.

注意: 避免在基于字符串的字段上使用 null=True,例如 CharFieldTextField 以及 FileField/ImageField

参考:Django null , Django blank

答案 10 :(得分:2)

我想你可能对 Save empty, nullable CharField's as null rather than as an empty string感兴趣。有很多关于这个的讨论,以及你可能遇到的一个非常实际的问题(例如,你想为每个用户添加一个openid url,它可以为null并且应该是唯一的。)

答案 11 :(得分:2)

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

nullblank的默认值为False。这两个值都在字段级别起作用,即我们是否要保留字段nullblank

null=True会将字段的值设置为NULL,即没有数据。基本上是用于数据库列的值。

date = models.DateTimeField(null=True)

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

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

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

答案 12 :(得分:2)

有一点,即使在null=TrueCharField上也需要TextField,即数据库为列设置了unique标志时。

>

换句话说,如果您在Django中具有唯一的Char / TextField,则需要使用以下代码:

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

对于非唯一的CharField或TextField,最好跳过null=True,否则某些字段将被设置为NULL,而另一些字段将被设置为“”,并且您必须检查字段值是否为NULL每次。

答案 13 :(得分:2)

用于数据库,而空白用于要在用户界面(例如文本字段)上显示的字段验证,以获取人的姓氏。 如果 lastname = models.charfield(blank = true),则它不会要求用户输入姓氏,因为这是可选字段。 如果 lastname = models.charfield(null = true),则意味着如果该字段未从用户那里获取任何值,则它将作为空字符串“”存储在数据库中。

答案 14 :(得分:2)

当我们在Django管理员中保存任何内容时,会在Django级别和数据库级别上执行两步验证。我们无法在数字字段中保存文字。

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

同样在Django-Admin级别,默认情况下所有字段都是必需的,你不能保存空白字段,Django会给你一个错误。

因此,如果要保存空白字段,则需要在Django和数据库级别上允许它。 blank = True - 将允许管理面板中的空字段 null = True - 允许将NULL保存到数据库列。

答案 15 :(得分:2)

下表说明了主要区别:

+--------------------------------------------------------------------+
| Purpose                  | null=True        | blank = True         |
|--------------------------|------------------|----------------------|
| Field can be empty in DB | Do this          | Unaffected           |
|--------------------------|------------------|----------------------|
| ModelForm(required field)| Unaffected       | field not required   |
|--------------------------|------------------|----------------------|
| Form Validation          | Unaffected       | field not required   |
|--------------------------|------------------|----------------------|
| on_delete=SET_NULL       | Need this        | Unaffected           |
+--------------------------------------------------------------------+

答案 16 :(得分:2)

用简单的话

空白不同于null。

完全与数据库相关的,而空白则是与验证相关的(形式要求)

如果null=True,则Django将store empty values as NULL in the database。如果字段具有blank=True,则表单验证将allow entry of an empty value。如果一个字段的值为blank = False,则必须填写该字段。

答案 17 :(得分:2)

模型中null = True和blank = True的含义还取决于在表单类中如何定义这些字段。

假设您定义了以下类:

class Client (models.Model):
    name = models.CharField (max_length=100, blank=True)
    address = models.CharField (max_length=100, blank=False)

如果表单类的定义如下:

class ClientForm (ModelForm):
    class Meta:
        model = Client
        fields = ['name', 'address']
        widgets = {
            'name': forms.TextInput (attrs = {'class': 'form-control form-control-sm'}),
            'address': forms.TextInput (attrs = {'class': 'form-control form-control-sm'})
        }

然后,“名称”字段将不是必需的(由于模型中的blank = True),而“地址”字段将是必需的(由于模型中的blank = False)。

但是,如果已经像这样定义ClientForm类:

class ClientForm (ModelForm):
    class Meta:
        model = Client
        fields = ['name', 'address']

    name = forms.CharField (
        widget = forms.TextInput (attrs = {'class': 'form-control form-control-sm'}),
    )
    address = forms.CharField (
        widget = forms.TextInput (attrs = {'class': 'form-control form-control-sm'}),
    )

然后,两个字段(“名称”和“地址”)都是必填字段,“因为声明性定义的字段按原样保留” https://docs.djangoproject.com/en/3.0/topics/forms/modelforms/),即默认表单字段的“ required”属性为True,即使在模型中将该字段设置为blank = True,这也需要填写字段“名称”和“地址”。

答案 18 :(得分:1)

null-默认为False 如果为True,则Django将在数据库中将null存储为null。

空白-默认为False 如果为true,则允许将该字段留空

更多,转到 https://docs.djangoproject.com/en/3.0/topics/db/models/

答案 19 :(得分:1)

Null与数据库完全相关,而空白与验证相关。如果字段具有blank = True,则在Django管理站点上的验证将允许输入空值。如果一个字段的值为blank = False,则该字段必填

答案 20 :(得分:1)

设置null=true时,如果未填写该字段,它将在数据库中设置null。如果 您设置blank='true不会为该字段设置任何值。

答案 21 :(得分:0)

简单的答案是:Null用于数据库表,而Blank用于Django表单。

答案 22 :(得分:0)

blank=True 可以设置为任何模型字段,以控制在表单中输入值时该字段是否可以留空。在这里,我们讨论的是输入数据。

null=True,如果我们为一个字段设置blank=True,该模型字段不会收到任何值,那么当数据写入数据库时​​,数据库或Django必须对该字段做一些事情。对于任何类型的文本内容,数据库中都会存储一个空字符串,因此数据库中存储了一个值。对于其他类型的字段,如日期字段或数字,我们使用特殊数据类型“null”。如果字段可能没有值,则可以使用“null”,但默认情况下,Django 不允许“null”值。这就是为什么您需要显式设置 null=True

假设您为任何非文本字段设置了 blank=True,但您没有指定“null=True”,Django 将不知道要存储什么并且会抛出错误。