如何在Django的CharField字段上设置NOT NULL非空约束
Django CharField设置NOT NULL约束解决方案
核心参数说明
先明确Django模型字段两个易混淆参数的作用:
null:控制数据库层面的约束,默认值为False,设置为False时对应数据库字段会加上NOT NULL约束,禁止存储NULL值blank:控制Django表单/Admin层面的校验,默认值为False,设置为False时表单提交不允许该字段为空
方案实现
仅需要数据库禁止NULL值
你当前的代码默认已经满足要求,所有未显式设置null=True的字段,生成表结构时都会自动加上NOT NULL约束。如果需要显式声明增强可读性,修改代码如下:
class Tutors(models.Model): # 显式声明null=False,数据库层面禁止存NULL first_name = models.CharField(max_length=20, null=False) last_name = models.CharField(max_length=20, blank=False, null=False) email = models.EmailField(max_length=254) birth_day = models.DateField(auto_now=False, auto_now_add=False) def __str__(self): return self.first_name + ' ' + self.last_name
需要同时禁止存储空字符串
如果你的需求是连空字符串''、全空白字符串也不允许存入,需要增加模型校验逻辑:
from django.core.exceptions import ValidationError class Tutors(models.Model): first_name = models.CharField(max_length=20, null=False) last_name = models.CharField(max_length=20, blank=False, null=False) email = models.EmailField(max_length=254) birth_day = models.DateField(auto_now=False, auto_now_add=False) def clean(self): # 校验字段不为空白字符串 if not self.first_name.strip(): raise ValidationError("first_name 不能为空白内容") if not self.last_name.strip(): raise ValidationError("last_name 不能为空白内容") def save(self, *args, **kwargs): # 保存前自动触发校验逻辑 self.full_clean() super().save(*args, **kwargs) def __str__(self): return self.first_name + ' ' + self.last_name
注意事项
- 不要给CharField类型字段设置
null=True,否则会允许数据库存储NULL和空字符串两种空值,增加后续业务判断成本 - 如果是已经存在数据的表要新增NOT NULL约束,需要先给现有数据补全对应字段的值,否则执行
migrate时会触发报错
内容的提问来源于stack exchange,提问作者jarjarbinks99
相关产品推荐
相关产品推荐

