虽然本人使用
django
也有几年的时间,但是还是对django
中数据模型的null
和blank
有点分不清楚,我想很多人也和我一样的困惑,现在将全面彻底的讲解下两个的区别。
一、null
的使用
- 1、默认是
False
的,如果设置为True
的时候,django
将会映射到数据表指定是否为空 - 2、如果这个字段设置为
False
的时候,如果没给这个字段传递任何值的时候,django
也会使用一个空字符串(''
)存储进去 - 3、如果这个字段设置为
True
的时候,django
会产生两种空值的情形(null
和空字符串) - 4、如果想要在表单验证的时候允许这个字符串为空的时候,
django
建议使用blank=True
- 5、如果你的字段
BooleanField
的时候,可以为空的建议使用NullBooleanField
-
1、数据模型代码
class BookModel(models.Model): """ 书籍的数据模型 """ uuid = models.UUIDField(unique=True, default=uuid.uuid4, verbose_name='uuid') name = models.CharField(max_length=100, default='', null=True, verbose_name='书籍名称') # null默认是False,但是本案例中还是写上去,更好区分 author = models.CharField(max_length=100, default='', null=False, verbose_name='作者') # blank=True仅仅是在表单校验的时候可以为空,别的时候没什么区别 price = models.FloatField(default=0, blank=True, verbose_name='价格') create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间') def __str__(self): return '
({}, {}, {}, {}, {}, {})'.format(self.uuid, self.name, self.author, self.price,self.create_time, self.update_time) class Meta(object): db_table = 'book'复制代码 -
2、
sql
语句CREATE TABLE `book` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) DEFAULT NULL, `price` double NOT NULL, `create_time` datetime(6) NOT NULL, `update_time` datetime(6) NOT NULL, `uuid` char(32) NOT NULL, `author` varchar(100) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uuid` (`uuid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8复制代码
-
3、数据库表结构
-
4、插入数据后显示对比
二、blank
的使用
- 1、这个字段是在表单验证的时候可以为空,默认是
False
- 2、这个和
null
是有区别的blank=True
仅仅是在表单验证的时候可以为空null=True
仅仅是数据库级别的null