【Django|ORM】null=True 和 blank=True
在 Django 的 ORM 中,null=True 和 blank=True 都是用于字段定义时的选项,它们分别控制着模型字段在数据库和表单中的行为。它们的具体含义和区别如下:
1. null=True:控制数据库中的空值
- 用途:控制数据库中该字段是否可以存储
NULL值(即数据库中的空值)。 - 作用:如果你将
null=True添加到某个字段,这意味着该字段在数据库中可以保存NULL(空值)。否则,Django 会在数据库中为该字段设置一个默认值,通常是空字符串(对于CharField和TextField)或0(对于IntegerField等数字字段),而不会是NULL。 - 适用范围:主要用于数据库层面的控制,尤其是对于数字字段和外键字段。
示例:
class MyModel(models.Model):
name = models.CharField(max_length=100, null=True) # 允许数据库中为 NULL
age = models.IntegerField(null=True) # 允许数据库中为 NULL
name和age字段在数据库中可以存储NULL值。
2. blank=True:控制表单中的空值
- 用途:控制字段是否可以为空,这个选项主要影响 Django 表单验证。
- 作用:如果你将
blank=True添加到某个字段,表示该字段在表单提交时是允许为空的。也就是说,在 Django 表单中,用户可以选择不填写该字段,而不会被视为验证错误。与null=True不同,blank=True仅在表单验证和模型的clean()方法中起作用,不影响数据库中的存储。 - 适用范围:主要用于表单验证或模型字段的验证。
示例:
class MyModel(models.Model):
name = models.CharField(max_length=100, blank=True) # 表单允许为空
age = models.IntegerField(blank=True) # 表单允许为空
- 在这个例子中,
name和age字段在 Django 表单提交时可以不填,但不代表它们在数据库中可以存储NULL,如果你没有设置null=True,它们会存储为空字符串或零(取决于字段类型)。
3. 两者组合:null=True 和 blank=True 同时使用
- 当你同时设置
null=True和blank=True时,字段在数据库中可以存储NULL值,并且在表单提交时该字段可以为空。
示例:
class MyModel(models.Model):
name = models.CharField(max_length=100, null=True, blank=True) # 允许数据库为 NULL,也允许表单为空
age = models.IntegerField(null=True, blank=True) # 允许数据库为 NULL,表单允许为空
- 在这种情况下,
name和age字段都可以在数据库中存储NULL,并且在表单提交时,用户可以选择不填写这些字段。
4. 区别总结
| 选项 | 影响范围 | 解释 |
|---|---|---|
null=True | 数据库层 | 控制数据库中该字段是否可以存储 NULL(空值)。 |
blank=True | 表单验证层 | 控制字段是否可以在表单提交时为空,不为空时通过表单验证。 |
5. 常见的组合方式
- 仅设置
null=True:通常用于那些希望在数据库中支持NULL值,但在表单中不允许为空的字段。例如:外键字段。class MyModel(models.Model): category = models.ForeignKey(Category, null=True, on_delete=models.SET_NULL) # 数据库可以为空 - 仅设置
blank=True:通常用于那些不希望数据库存储NULL值,但希望在表单中允许为空的字段。例如:CharField和TextField。class MyModel(models.Model): description = models.TextField(blank=True) # 表单可以为空,但数据库中不能为空(会存储空字符串) - 同时设置
null=True和blank=True:适用于那些在数据库中可以为空,并且表单提交时也允许为空的字段。class MyModel(models.Model): name = models.CharField(max_length=100, null=True, blank=True)
6. 特别注意
- 对于
CharField和TextField,如果你设置null=True,通常建议同时设置blank=True。因为在 Django 中,空字符串""和NULL是有区别的。通常,Django 认为空字符串表示”没有值”(而非未知值),而NULL表示该字段没有定义任何值。 在CharField和TextField字段上,通常不推荐使用null=True,而是直接使用空字符串表示空值,除非有特定需求。# 推荐写法: class MyModel(models.Model): name = models.CharField(max_length=100, blank=True) # 使用空字符串表示空值
7. 总结
null=True影响数据库层面,控制字段是否可以存储NULL。blank=True影响表单层面,控制字段是否在表单中可以为空。- 你可以根据具体的需求选择合适的选项,控制数据库和表单的行为。