Django 是 Python Web 开发框架中的一个重要代表。在 Django 的数据库操作中,有 one-to-one、many-to-one、many-to-many 等关系型字段,这些字段中均有 null 和 blank 两个属性。二者的区别十分微妙但却十分重要,本文将以 Django 数据模型中 null 和 blank 的区别为主题,从多个角度进行分析解释。
1.定义
- null:指的是数据库层面的空值,即某个字段的值为空
- blank:指的是表单层面的空值,即某个字段在表单中允许为空
注意:在数据模型中,null=True 表示数据库中对应的字段可以为空,blank=True 表示表单中对应的字段可以为空,如果同时设置两个属性,则该字段在数据库和表单中均可以为空
2.在模型级别的区别
null 与 blank 在数据模型中的区别主要在于:
- null:用于控制数据库层面的数据约束。如果 null=True,那么 django 会对该字段在数据库中实际存储的效果具有控制和约束作用。比如,在执行 save() 方法时,如果该字段数据为空,则会在数据库中存储为 NULL,而不是空字符串或其他有值的类型
- blank:用于控制表单层面的控件外观。如果 blank=True,那么 django 会在表单中为该字段创建一个可跳过的空间,即该字段在表单中可以为空或者什么都不填,但是在数据库中,该字段仍然是需要被真实定义并存储的,定义这个字段时需要考虑其是否可为空,在设计表单时需要考虑用户是否需要填写该字段。如果 blank=False,那么在设计表单时该字段必须被填写
3.在浏览器表单提交中的区别
当我们在浏览器中向一个模型的 fields 发送 POST 请求时,两者的区别可以通过以下场景进行验证:
- null=False,blank=False
1)字段定义:`field = models.CharField()`
2)保存数据:直接提交或者通过 save() 方法保存都可以
3)场景验证:当出现 fields 不足等提交错误时,系统会返回对应的错误提示
- null=True,blank=False
1)字段定义:`field = models.CharField(null=True)`
2)保存数据:直接提交或者通过 save() 方法保存均不能自动实现字段的 null 执行(要等到我们在数据库中看到该字段的存储才能真正 null)
3)场景验证:除非使用自定义验证,否则不会影响控件表单验证的性能
- null=False,blank=True
1)字段定义:`field = models.CharField(blank=True)`
2)保存数据:可以在表单中不填写该字段进行保存或者在 save() 方法中显式传入参数为空字符串进行保存
3)场景验证:控件表单验证正常,但只能通过数据库级别的唯一与否来判断该字段是否为空
- null=True,blank=True
1)字段定义:`field = models.CharField(blank=True, null=True)`
2)保存数据:完全可以在表单中不填写该字段进行保存,入库后相当于是否执行数据库层面上的 null 设置 取决于我们自身的设计或者约束
3)场景验证:控件表单验证可做可不做,影响线上环境在于是否涉及到唯一约束
4.小结
在我们进行 Django 应用开发中,如何更好地使用数据模型中 null 和 blank 这两个属性的区别,尤其是在不同的场景中,是十分重要的。其中,null 主要用于数据库层面的数据约束,而 blank 则侧重于表单层面的控件外观和控制,但是二者之间的关系是十分密切的。对于开发者来说,要在数据设计和表单设计时注意这两个属性的设置,才能更好地提升系统的稳定性和健壮性。