models.BooleanField(default=False)返回True而非False异常问题
Django布尔字段默认值不生效的排查步骤
检查数据库现有数据
模型的default参数仅对新增数据生效,旧数据不会被自动更新。可以通过Django Shell查询实际存储值:python manage.py shell from yourapp.models import YourModel print(YourModel.objects.values('issevenDisabled', 'issevenSaved', 'iseightDisabled', 'iseightSaved'))如果旧记录的字段值本来就是
True,输出自然会是True。确认迁移是否执行到位
修改default后必须执行迁移同步到数据库:python manage.py makemigrations python manage.py migrate可以直接查看数据库表的字段默认值,比如MySQL用
DESCRIBE your_table_name;,PostgreSQL用\d your_table_name,确认数据库层面的默认值是否为false。排查数据写入逻辑
全局搜索这些字段名,检查是否有代码在创建/更新对象时手动赋值为True:- 视图中是否有
YourModel.objects.create(issevenDisabled=True, ...)这类硬编码 - 模型的
save()方法是否强制修改了这些字段的值 - 序列化器或表单是否默认设置了这些字段为
True
- 视图中是否有
检查序列化/响应处理逻辑
如果是通过DRF返回的结果,排查序列化器:- 是否用了
SerializerMethodField重写了字段取值 to_representation方法有没有篡改字段值- 前端提交的参数是否覆盖了默认值,后端未做校验直接存储
- 是否用了
清除缓存验证
如果项目使用了缓存(如Redis、Django内置缓存),可能缓存了旧数据。执行缓存清除操作后重新查询:# 若安装了django-clearcache python manage.py clearcache或者手动清除缓存后端的对应键值。
排查模型继承关系
如果当前模型继承了父模型,检查父模型是否有同名字段,或父模型的save()方法是否修改了这些字段的值;代理模型也要确认是否存在字段覆盖的情况。
内容的提问来源于stack exchange,提问作者KumarZ
相关产品推荐
相关产品推荐

