在django中区分null = True,空白= True

本文详细探讨了Django模型中null和blank的区别,说明null影响数据库存储,允许字段在数据库中为NULL,而blank影响表单验证,允许表单字段留空。建议在基于字符串的字段上避免使用null=True,遵循Django使用空字符串表示无数据的约定。
摘要由CSDN通过智能技术生成

当我们在Django中添加数据库字段时,通常会编写models.CharField(max_length=100, null=True, blank=True) 。 对ForeignKeyDecimalField等进行相同的操作。

  1. null=Truenull=True
  2. blank=Trueblank=True
  3. null=Trueblank=True

关于不同的字段( CharFieldForeignKeyManyToManyFieldDateTimeField )。 使用1/2/3有哪些优点/缺点?


#1楼

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

#2楼

如Django模型字段参考中所述: 链接

栏位选项

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


null

Field.null

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

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

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

注意

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


blank

Field.blank

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

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


#3楼

只是null=True定义数据库应接受NULL值,另一方面, blank=True定义在表单验证时此字段应接受或不接受空白值(如果blank=True则接受该字段中没有值的表单,而blank=False [默认值]在表单验证中将显示此字段为必填错误。

null=True/False与数据库有关的null=True/False

blank=True/False与表单验证有关的blank=True/False


#4楼

这是具有blank= Truenull=True的字段的示例

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

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

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


#5楼

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

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

同样在Django-Admin级别,默认情况下所有字段都是必填字段,您无法保存空白字段,Django会抛出错误。

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


#6楼

至关重要的是要了解Django模型字段定义中的选项至少有两个作用:定义数据库表,定义默认格式和验证模型形式。 (我之所以说“默认值”,是因为可以始终通过提供自定义表单来覆盖这些值。)某些选项影响数据库,某些选项影响表单,而某些选项同时影响这两种形式。

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

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

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

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

    • 最常见的用法是用于基于字符串的可选字段。 如文档中所述 ,Django习惯用法是使用空字符串表示缺少的值。 如果还允许使用NULL则最终将以两种不同的方式来指示缺少的值。

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

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

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

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

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


#7楼

我认为您可能对将空的可为空的CharField保存为null而不是空字符串感兴趣。 关于此的讨论很多,您可能会遇到一个非常实际的问题(例如,您想为每个用户添加一个openid URL,该URL可以为null,并且应该是唯一的)。


#8楼

null = True

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

blank = True

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


#9楼

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

#10楼

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

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

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

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


#11楼

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

我遵循此表: 在此处输入图片说明

在此处输入图片说明


#12楼

对于NULL == TRUE

    The default value of both null and blank is False. Both of these values work
 at field level i.e., whether we want to keep a field null or blank.

        null=True will set the field’s value to NULL i.e., no data. It is 
basically for the databases column value.


        date = models.DateTimeField(null=True)

对于BLANK == TRUE

    blank=True determines whether the field will be required in forms. This 
includes the admin and your own custom forms.

    title = models.CharField(blank=True) // title can be kept blank. In the 
database ("") will be stored.

如果您认为有帮助,请点击


#13楼

null和blank的默认值为False。

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

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

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

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


#14楼

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


#15楼

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

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

两者的组合是如此频繁,因为通常如果您要允许表单中的字段为空白,则还需要数据库以允许该字段的NULL值。 CharFieldTextField是一个例外,在Django中,它们从未保存为NULL 。 空白值被存储在DB中作为空字符串( '' )。

一些例子:

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的用例,但是在通过某种方式处理对象时是可选的)像外壳一样。)

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

models.CharField(null=True) # NULL allowed, but will never be set as NULL

Django永远不会将CHARTEXT类型保存为NULL ,因此null=True是不必要的。 但是,您可以将这些字段之一手动设置为None以强制将其设置为NULL 。 如果您有可能需要这样做的情况,则仍应包含null=True

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值