Django模型CharField设置blank=False仍可创建空值实例问题咨询
问题原因说明
- 你传入的是空字符串
'',和NULL是完全不同的两个值,null=False仅限制数据库不能存储NULL,不限制空字符串存储。 blank=False仅作用于Django表单校验场景,直接调用ORM的create()方法不会触发该校验规则。
1. null参数的作用范围
null是数据库层面的约束,null=False仅表示数据库字段不允许存储NULL值,对空字符串''没有限制。
Django中所有字符串类型字段(包括CharField/TextField/ImageField/SlugField等),默认会把空值存储为空字符串而非NULL,因此你传入''完全符合null=False的数据库约束,不会触发报错。
2. blank参数的作用范围
blank是表单校验层面的参数,blank=False仅表示在使用ModelForm、Admin后台提交表单时,该字段不允许为空。
你直接调用ORM的create()/save()方法时,Django不会自动执行表单级别的校验,因此blank=False的规则在此场景下完全不生效。
扩展:禁止存储空字符串的实现方案
如果需要从模型层面限制字段不能传入空字符串,可以通过添加校验器实现:
from django.core.validators import MinLengthValidator # 给字段添加最小长度校验 title = models.CharField(max_length=30, validators=[MinLengthValidator(1)])
如果需要ORM操作时也需要触发校验,可以在调用save()之前手动执行模型的full_clean()方法,该方法会主动执行所有字段的校验规则:
scenario = Scenario(title='', subtitle='', description='', image_url='', slug='') scenario.full_clean() # 空字符串会在此步骤抛出ValidationError scenario.save()
内容的提问来源于stack exchange,提问作者Welyweloo
相关产品推荐
相关产品推荐

