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

2024-12-13 08:36:00
admin
原创
151
摘要:问题描述:当我们在 Django 中添加模型字段时,我们一般会这样写:models.CharField(max_length=100, null=True, blank=True) ForeignKey对等 也做同样的事情DecimalField。那么它们之间的基本区别是什么:null=True仅有的blan...

问题描述:

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

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

ForeignKey对等 也做同样的事情DecimalField。那么它们之间的基本区别是什么:

  1. null=True仅有的

  2. blank=True仅有的

  3. null=Trueblank=True

对于不同的(CharFieldForeignKeyManyToManyFieldDateTimeField)领域?使用选项 1、2 或 3 有哪些优点/缺点?


解决方案 1:

null=True设置NULL(与NOT NULL)数据库中的列。Django 字段类型的空白值(例如DateTimeField或 )ForeignKey将存储NULL在数据库中。

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

两者的组合之所以如此常见,是因为通常如果您要允许表单中的某个字段为空,那么您还需要数据库允许NULL该字段有值。例外是CharFields 和TextFields,在 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

CHARDjangoTEXT永远不会将和类型保存为 ,因此是不必要的。但是,您可以手动将其中一个字段设置为 ,以强制将其设置为。如果您遇到可能需要这样做的情况,您仍应包括。NULL`null=TrueNoneNULL`null=True

解决方案 2:

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

解决方案 3:

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

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

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

  • null=True, blank=True:这意味着该字段在任何情况下都是可选的。但如下所述,这不是使基于字符串的字段成为可选的推荐方法。

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

+ 最常见的用途是用于可选的基于字符串的字段。如文档中所述,Django 习惯用法是使用空字符串来表示缺失值。如果`NULL`也允许,您将最终得到两种不同的方式来表示缺失值。(但是,如果字段也是`unique`,则必须使用`null=True`以防止多个空字符串无法通过唯一性检查。)
+ 另一种常见情况是,您希望根据另一个字段的值自动计算一个字段(`save()`例如,在您的方法中)。您不希望用户在表单中提供值(因此`blank=True`),但您希望数据库强制始终提供值(`null=False`)。
+ 另一个用途是当您想要指示 是`ManyToManyField`可选的时。由于此字段是作为单独的表而不是数据库列实现的,因此`null`是无意义的。但是 的值`blank`仍会影响表单,控制在没有关系时验证是否成功。
  • null=True, blank=False:这意味着表单需要值,但数据库不需要。这可能是最不常用的配置,但也有一些用例:

+ 即使您的业务逻辑实际上并不需要,要求用户始终包含一个值也是完全合理的。毕竟,表单只是添加和编辑数据的一种方式。您可能有代码生成的数据不需要像您希望人工编辑器那样进行严格的验证。
+ 我见过的另一个用例是,当您有一个`ForeignKey`不希望允许级联删除的对象时。也就是说,在正常使用中,关系应该始终存在(`blank=False`),但如果它指向的东西碰巧被删除,您不希望这个对象也被删除。在这种情况下,您可以使用`null=True`和`on_delete=models.SET_NULL`实现一种简单的软删除。

解决方案 4:

您可能已经有了答案,但直到今天,仍然很难判断是否要将一个字段设置为null=Truenullblank=True或将两个字段同时设置为 null。我个人认为,为开发人员提供这么多选项是相当无用和令人困惑的。让他们随意处理 null 或空白。

我遵循以下来自Two Scoops of Django 的表格:在此处输入图片描述

表格显示何时对每种字段类型使用 null 或空白

解决方案 5:

正如Django Model Field 参考中所述:链接

字段选项

以下参数适用于所有字段类型。所有参数均为可选。

null

Field.null

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

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

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

笔记

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

blank

Field.blank

True,则允许字段为空。默认为False

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

解决方案 6:

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

null=True/False与数据库相关

blank=True/False与表单验证相关

解决方案 7:

blank= True以下是带有和的字段的示例null=True

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

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

null = True:告诉我们的数据库,在我们的数据库字段中记录空值是可以的,并且不会给出错误。

解决方案 8:

如果设置null=True,它将允许将数据库列的值设置为NULL。如果仅设置blank=True,django 将为该列设置默认的新值,等于""

即使在或上,也有一个null=True需要的情况,那就是当数据库为该列设置了标志时。在这种情况下,您需要使用以下命令:CharField`TextField**unique`**

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

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

解决方案 9:

null和空白的默认值均为False

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

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

话虽如此,拥有带有null=True和 的字段是完全没问题的blank=False。这意味着在数据库级别上该字段可以是NULL,但在应用程序级别上它是必需字段。

现在,大多数开发人员都犯了一个错误:定义null=True基于字符串的字段,例如CharFieldTextField。避免这样做。否则,您最终会得到两个“无数据”的可能值,即:None和一个空字符串。为“无数据”设置两个可能的值是多余的。Django 惯例是使用空字符串,而不是NULL

解决方案 10:

null = True

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

blank = True

意味着 django 表单中没有验证的约束。因此,当您modelForm为这个模型填充内容时,您可以将带有此选项的字段保留为未填写状态。

解决方案 11:

以下是null=True和的主要区别blank=True

null和的默认值blank均为 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:

null = True || blank = True || null = True && blank = True

class TestModel(models.Model):
    field1 = models.CharField(max_length=100, null=True)
    field2 = models.CharField(max_length=100, blank=True)   # it's not a correct way
    field3 = models.CharField(max_length=100, null=True, blank=True)

数据库字段为:MySQL

CREATE TABLE TestModel (
     `id`        INT(10)        NOT     NULL      AUTO_INCREMENT,

     `field1`    VARCHAR(100)   NULL    DEFAULT   NULL,
     `field2`    VARCHAR(100)   NOT     NULL,
     `field3`    VARCHAR(100)   NULL    DEFAULT   NULL,
)

案例-01:null = True

db:   db   field is accepts null value
form: form field is `required`

NB: DB IS ACCEPTS NULL VALUE, BUT FORM FIELD IS REQUIRED. SO FORM IS 
SUBMITTED WHEN THIS FIELD HAVE SOME VALUE. it's good.

案例-02:blank = True

db:   db   field is not accepts null value
form: form field is `optional`

NB: FORM IS VALID WITHOUT ANY VALUE, BUT DB IS NOT ACCEPTS NULL VALUE.
SO THE FORM IS SUBMITTED WITHOUT ANY VALUE THEN BOOM. it's worst.

案例-03:null = True && blank = True

db:   db   field is accepts null value
form: form field is `optional`

NB: HERE FORM FIELD IS OPTIONAL & FORM IS VALID WITHOUT ANY VALUE 
& DB ALSO ACCEPTS NULL VALUE. SO, IT'S BEST TO USE `null=True && blank=True`

:)

解决方案 13:

当我们在 Django admin 中保存任何内容时,都会发生两步验证,分别是在 Django 级别和数据库级别。我们无法在数字字段中保存文本。

数据库的数据类型为NULL,这没什么。当 Django 在数据库中创建列时,它会指定它们不能为空。如果您尝试保存,NULL则会收到数据库错误。

同样在 Django-Admin 级别,所有字段默认都是必填的,您不能保存空白字段,否则 Django 会抛出错误。

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

解决方案 14:

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

解决方案 15:

以下是简单来说它的答案:-

通过null = True我们告诉数据库,模型的这个字段可以为 NULL,通过blank = True我们告诉Django,模型的这个字段可以为 NULL

解决方案 16:

在 django 中,null=True 与数据库模式相关,允许数据库中存在 NULL 值,而 blank=True 与表单验证相关,允许在表单提交时将字段留空。

解决方案 17:

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

解决方案 18:

Null 纯粹与数据库有关,而 blank 与验证有关。如果字段具有 blank=True ,则 Django 管理站点上的验证将允许输入空值。如果字段具有 blank=False ,则该字段将是必填字段

解决方案 19:

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在基于字符串的字段上使用,例如CharFieldandTextFieldFileField/ ImageField

参考:Django null,Django blank

解决方案 20:

null理解 Django 中和之间的区别blank对于初学者来说至关重要,因为它影响数据库完整性和表单如何验证数据。

下表总结了它们的主要区别和用途:

在此处输入图片描述

让我详细解释一下可能的优点和缺点。

1. 当仅null=True

允许在数据库中存储NULL值。这是与数据库架构相关的设置。

优点:这为非字符串字段的数据库设计提供了灵活性,允许明确存储“无数据”。

缺点:对于字符串字段,可能会导致混合NULL和空字符串(表示“无数据”),这是不一致的,而且这不会影响表单验证,表单上仍需要该字段。

2. 当仅blank=True

允许表单中的字段留空。这与 Django 表单和管理界面中的验证有关。这适用于所有字段类型,它使表单中的字段成为可选字段。

优点:不需要在表单中输入可选字段,从而增强了用户体验。

缺点:当与非字符串字段一起使用时,blank=True不带任何null=True会导致出现错误IntegrityError。此外,它不会改变数据库架构,因此数据库层仍然需要数据。

3. 何时null=Trueblank=True

允许数据库中存在 NULL 值,并使表单中的字段为可选字段。

优点:此组合提供了最大的灵活性,允许字段在数据库和表单上下文中都是可选的。它对于非字符串字段尤其有用,因为缺少数据时最好用 来表示NULL

缺点:对于字符串字段,通常不鼓励组合null=True和,blank=True以防止数据库中混合NULL和空字符串,这会导致数据表示不一致。

解决方案 21:

用非常简单的话来说

空白与空值不同。

null纯粹与数据库相关,而blank 则与验证相关(表单中需要)

如果null=True,Django 将store empty values as NULL in the database。如果字段有blank=True,表单验证将allow entry of an empty value。如果字段有 blank=False ,则该字段将是必填项。

解决方案 22:

null=Trueblank=Truedjango.db.models 中的字段属性。null 是数据库相关的,而空白是验证相关的。

无效的

默认值为null=False。如果 null=False,Django 将不允许数据库列中存在 NULL 值。

如果null=True,Django 将在数据库列中将空值存储为 NULL。对于 CharField 和 TextField,django 将使用空字符串 '' 而不是 NULL。避免对 CharField 和 TextField 使用 null 属性。一个例外是当 CharField 具有unique=Trueblank=True时,则null=True需要 。

空白的

默认值为blank=False。如果 blank=False,则该字段为必填项。

如果是blank=True,则该字段是可选的,可以留空。blank=True 和 null=False 将需要在模型上实现 clean() 来以编程方式设置任何缺失的值。

解决方案 23:

根据文档,null 确实与数据库相关。如果 null=true,DB 将把 null 输入存储为 null。否则,空字符串将存储为空字符串。而如果 blank=true,表单将验证它为 ok,否则该字段将被表单视为“必填”。

默认情况下,两者均为 false。

解决方案 24:

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

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

更多详情,请访问
https://docs.djangoproject.com/en/3.0/topics/db/models/

解决方案 25:

下表显示了主要区别:

+--------------------------------------------------------------------+
| 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           |
+--------------------------------------------------------------------+

解决方案 26:

模型中 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'})
        }

然后,“名称”字段将不是必填的(因为模型中的空白= True),而“地址”字段将是必填的(因为模型中的空白= 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。

解决方案 27:

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

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

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

解决方案 28:

Django 模型中的每个选项都有两个用途

  1. 在数据库级别定义字段约束(例如 SQL、Postgresql 或任何其他)

  2. 在表单级别定义字段约束(在数据库层之上的框架级别)

null现在让我们回到blank

  • blank与 Django 表单相关。它用于在 admin 或 Django 中验证 Django 表单。具体来说,当我们调用form.is_valid()

  • null与数据库相关。它告诉底层数据库该列是否允许null保存值。

例如,让我们看下面的例子-

class Company(models.Model):
    name = models.CharField(max_length=100)
    website = models.UrlField()
    founded_on = models.DateField(blank=True, null=False)
    random_date = models.DateFeild(blank=False, null=True)
    random_text = models.TextField(null=True, blank=True)

我定义了一个Company模型,它有 2 个字段,我们正在研究这些字段blanknull选项。让我们看看不同字段会发生什么

  • founded_on:可以在表单级别(框架/语言级别)接收空string值。在保存到数据库时,我们会引发异常IntegrityError,因为数据库不会接受该null值。null`false`

  • random_date:通过验证错误在表单级别(框架)接收空值,因为 true 不允许空白blank,即在表单级别设置约束。但是,它也允许列位于null数据库层。

  • random_text:这个选项意味着允许将字段保存为null在数据库层,并且string根据 Django 表单验证逻辑,空值也允许为有效数据blank=True。简而言之,它可以接收空值(在框架级别,并且可以在数据库级别存储空值。

为了解决所有这些混淆,请考虑将数据库提交作为两层过程。

  • 首先,它填写表格,我们可以在框架级别调用验证数据。

  • 其次,它有一个数据库级选项,有助于定义数据库约束。

blank是框架级别的事情,而null这是数据库级别的限制。

解决方案 29:

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

解决方案 30:

当你说 null=False 时,这意味着必须将数据传递到数据库进行保存。当你说 blank=False 时,这意味着必须从前端输入数据,反之亦然

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用