在使用Django写后端代码时候,需要操作数据库,默认使用的是sqlite3。
在models.py文件中我们需要定义所使用的数据模型,和数据库定义表结构类似。
这里有一个特别需要区分的地方是,关于null和blank。
首先需要明确的是,null表示什么都没有,而blank表示空白。
有这两个组合,可以有以下的四种情况:
1. blank=True、null=True。统一的表明了该字段(列)是可以为空的。
2. blank=False、null=False。统一的表面了该字段(列)不可以为空。
3. blank=True、null=False。这个设定的意义在于,某些字段并不希望用户在表单中创建(如slug),而是通过在save方法中根据其他字段生成。
4. blank=False、null=True。这个设定不允许表单中该字段为空,但是允许在更新时或者通过shell等非表单方式插入数据该字段为空。
下面一个小例子:
class UserInfo(models.Model):
phone = models.CharField(verbose_name='手机号', max_length=11, unique=True)
token = models.CharField(verbose_name='用户TOKEN', max_length=64, null=True, blank=True)
在这个例子中,我们对token字段设置了允许为空。
null 是从数据库层面,允许为空,如果null==True的话,Django 在数据库中会将空值(empty)存储为 NULL,用SQL来说明就是为该列添加了NOT NULL的约束。默认是False。
blank是用于验证。如果一个字段的 blank=True ,Django 在进行表单数据验证时,会允许该字段是空值。如果字段的 blank=False ,该字段就是必填的。
这里会有一个常见的疑问如下:
问题 :只设定blank=True而没有设定null=True的时候,通过表单创建模型实例并且表单在该字段上没有值时数据库不报错呢?当没有设定null=True时,该列在数据库中就存在NOT NULL的约束,如果插入数据时这一列没有值,按理说数据库应该会报错才对?
解答:Django在处理某些在数据库中实际的存储值为字符串的Field时(如CharField, TextField, ImageField图片文件的路径),永远不会向数据库中填入空值。如果表单中某个CharField或者TextField字段为空,那么Django会在数据库中填入"",而不是null.所以""不会被认为是null,故不会报错。只有显示指明null==True时,如果是空的情况,会填入NULL。
以上这个疑问,也恰好说明了为啥会需要第三四种组合情况的时候。
参考资料:
1. https://blog.csdn.net/liqiang19910328/article/details/43526213