Django 5.0创建Faculty实例未触发字段完整性错误的原因
为什么Django 5.0中创建空Faculty实例未触发完整性错误?
先看你定义的Faculty模型:
class Faculty(models.Model): name = models.CharField(max_length=255) short_name = models.CharField(max_length=15) description = models.CharField(max_length=512) logo = models.ImageField(upload_to=faculty_upload_to, null=True)
当你执行Faculty.objects.create()或者:
faculty = Faculty() faculty.save()
会在数据库中创建空条目,比如:
>>> from universities.models import * >>> Faculty.objects.create() <Faculty: Faculty object (2)>
这种情况是Django 5.0的两个特性共同作用的结果:
1. 数据库字段约束的默认调整
Django 5.0对CharField和TextField的数据库字段生成逻辑做了修改:
- 当字段处于默认状态(未设置
null=True和blank=True)时,数据库字段会被创建为NOT NULL DEFAULT ''——也就是字段非空,但默认值为空字符串。 - 这意味着即使你不给字段赋值,数据库会自动填入空字符串,不会触发数据库层面的非空完整性错误。
2. ORM默认不触发全量模型验证
Django的ORM默认不会在调用save()或create()时自动执行模型的全量验证(即full_clean()方法):
- 你的
CharField默认blank=False,这个参数的作用是限制字段不能是空字符串,但这个校验只有在full_clean()被调用时才会触发(比如Django表单验证会自动调用,或者你手动调用)。 - 如果你没有先调用
faculty.full_clean()就执行save(),ORM不会检查字段是否为空字符串,直接将空字符串存入数据库,自然不会抛出验证错误。
如何触发预期的错误
如果想要创建空实例时触发验证错误,可以通过以下方式:
- 手动调用
full_clean()再保存:faculty = Faculty() faculty.full_clean() # 这里会抛出ValidationError,提示字段不能为空 faculty.save() - 在模型的
save()方法中强制加入验证逻辑:class Faculty(models.Model): name = models.CharField(max_length=255) short_name = models.CharField(max_length=15) description = models.CharField(max_length=512) logo = models.ImageField(upload_to=faculty_upload_to, null=True) def save(self, *args, **kwargs): self.full_clean() super().save(*args, **kwargs)
内容的提问来源于stack exchange,提问作者Wilfried-Tech
相关产品推荐
相关产品推荐

