Django中clean函数引发非空约束失败问题求助
问题根源
- 你的
clean方法逻辑过于复杂,存在判断错误,导致banner_button_activate为False时,错误触发了非空校验。 - 若之前模型中
banner_button_url未设置null=True,后续添加后未执行数据库迁移,数据库层面仍会保留NOT NULL约束,引发报错。
修正步骤
1. 简化校验逻辑
替换原clean方法,只在按钮激活时校验标题和URL的非空性,完全匹配你的需求:
def clean(self): # 按钮激活时,标题和URL必须填写 if self.banner_button_activate: if not self.banner_button_title: raise ValidationError({"banner_button_title": "Eğer bu bölüm aktifse button title dolu olmalı."}) if not self.banner_button_url: raise ValidationError({"banner_button_url": "Eğer bu bölüm aktifse buton url dolu olmalı."}) # 调用父类clean方法,确保默认校验逻辑执行 super().clean()
2. 同步数据库配置
执行迁移命令,将模型的null=True, blank=True配置同步到数据库:
python manage.py makemigrations python manage.py migrate
额外说明
原clean方法的逻辑错误在于:当banner_button_activate为False时,只要标题或URL为空,就会进入错误分支,这与你"不激活时填写与否均可"的需求冲突。简化后的逻辑仅聚焦激活状态下的必填校验,避免了逻辑混乱。
内容的提问来源于stack exchange,提问作者fero
相关产品推荐
相关产品推荐

