chan

朝生暮死不足笑 但悲百年不足道

【Django|ORM】null=True 和 blank=True


在 Django 的 ORM 中,null=Trueblank=True 都是用于字段定义时的选项,它们分别控制着模型字段在数据库和表单中的行为。它们的具体含义和区别如下:

1. null=True:控制数据库中的空值

  • 用途:控制数据库中该字段是否可以存储 NULL 值(即数据库中的空值)。
  • 作用:如果你将 null=True 添加到某个字段,这意味着该字段在数据库中可以保存 NULL(空值)。否则,Django 会在数据库中为该字段设置一个默认值,通常是空字符串(对于 CharFieldTextField)或 0(对于 IntegerField 等数字字段),而不会是 NULL
  • 适用范围:主要用于数据库层面的控制,尤其是对于数字字段和外键字段。

示例:

class MyModel(models.Model):
    name = models.CharField(max_length=100, null=True)  # 允许数据库中为 NULL
    age = models.IntegerField(null=True)  # 允许数据库中为 NULL
  • nameage 字段在数据库中可以存储 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)  # 表单允许为空
  • 在这个例子中,nameage 字段在 Django 表单提交时可以不填,但不代表它们在数据库中可以存储 NULL,如果你没有设置 null=True,它们会存储为空字符串或零(取决于字段类型)。

3. 两者组合:null=Trueblank=True 同时使用

  • 当你同时设置 null=Trueblank=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,表单允许为空
  • 在这种情况下,nameage 字段都可以在数据库中存储 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 值,但希望在表单中允许为空的字段。例如:CharFieldTextFieldclass MyModel(models.Model): description = models.TextField(blank=True) # 表单可以为空,但数据库中不能为空(会存储空字符串)
  • 同时设置 null=Trueblank=True:适用于那些在数据库中可以为空,并且表单提交时也允许为空的字段。 class MyModel(models.Model): name = models.CharField(max_length=100, null=True, blank=True)

6. 特别注意

  • 对于 CharFieldTextField,如果你设置 null=True,通常建议同时设置 blank=True。因为在 Django 中,空字符串 ""NULL 是有区别的。通常,Django 认为空字符串表示”没有值”(而非未知值),而 NULL 表示该字段没有定义任何值。 在 CharFieldTextField 字段上,通常不推荐使用 null=True,而是直接使用空字符串表示空值,除非有特定需求。 # 推荐写法: class MyModel(models.Model): name = models.CharField(max_length=100, blank=True) # 使用空字符串表示空值

7. 总结

  • null=True 影响数据库层面,控制字段是否可以存储 NULL
  • blank=True 影响表单层面,控制字段是否在表单中可以为空。
  • 你可以根据具体的需求选择合适的选项,控制数据库和表单的行为。
评论
还没有评论
    发表评论 说点什么