Model中null属性的使用方法
在Django模型介绍的博客Django学习Day9——模型的使用(一)中,我们简单提到了模型中null属性和blank属性的区别,null属性是数据库级别的,对于存储的数据进行约束;而blank属性是用于表单验证环节。这篇博客,对于null属性的使用进行更加详细的介绍。
1、null = True
null = True 表示该字段可以存储NULL。则在数据库中该字段会用NULL来存储空值,即如果传入空值,数据库中显示为NULL。
示例如下:
我们创建数据表Test,其中四个不同数据类型的字段均设置为null = True。
from django.db import models
class Test(models.Model):
name = models.CharField(max_length=50, null=True)
age = models.SmallIntegerField(null=True)
email = models.EmailField(null=True)
info = models.TextField(null=True)
然后,我们向数据表Test中传入空数据,其中空数据是指:(1)新增数据时,字段不传入参数;(2)新增数据时,字段传入值设置为None。
因此,下面两种方式,传入的数据均为空数据。
在数据库中进行查看:
可以看到,当null设置为True的时候,如果传入空值,则在数据表中使用NULL来表示。
注意:对于字符串来讲,空字符串''和空值是不同的概念。如果,我们传入空字符串,在数据库中是不会显示为NULL的,如下所示:
延伸内容:
1、如果我们把name字段设置为UNIQUE索引,对于空字符串来讲,数据表中name字段不能出现两个'',否则会违背唯一性约束;但是name字段可以有多个NULL。
如下所示:
现在数据表中的内容是:
然后,我们在name字段添加唯一索引:
此时,如果我们新增数据的时候,将name字段设置为'',会报唯一性约束的错误:
2、如果我们为null = True的字段设置了默认值,那么传入空值的时候,有两种情况:
(1)如果传入空值的时候,不给字段传值,会将默认值存入到数据库中。
from django.db import models
class Test(models.Model):
name = models.CharField(max_length=50, null=True, unique=True, default='佚名')
age = models.SmallIntegerField(null=True, default=18)
email = models.EmailField(null=True, default='xxx@163.com')
info = models.TextField(null=True, default='默认信息')
此时,新增数据的时候,依然传入空值:
在数据库中,存储的是每个字段的默认值:
(2)如果传入空值的时候,字段传入值设置为None,这时不会将默认值存入到数据库中,仍然存NULL。
2、null = False
null = False 表示该字段不可以存储NULL。传入空值的时候也存在两种情况:
首先,我们对之前的Test表进行修改:(这里我们删去了整型字段age,因为整型字段如果设置null = False,必须设置默认值)
from django.db import models
class Test(models.Model):
name = models.CharField(max_length=50, null=False)
email = models.EmailField(null=False)
info = models.TextField(null=False)
(1)新增数据时,不给字段传值,对于字符串类型的字段,即使我们没有设置默认值,Django也会自动将该数据类型下的默认值存储到数据库。
在数据库中进行查看(这里字符串类型默认值是空字符串''):
(2)新增数据时,字段值设置为None,会报错。
报错信息如下: