You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django新增非空模型字段执行migrate时报无默认值错误咨询

Django新增非空字段迁移报错原因及解决方案

报错根本原因

第一次迁移无异常的原因

你首次定义模型执行迁移时,操作是新建整个instructor_timesheet数据表,此时表中没有任何已存在的行记录,Django直接按字段定义创建带NOT NULL约束的字段即可,不需要填充历史数据,因此即使字段没有设置默认值也不会触发异常。

你初始定义的day_2相关字段是伴随表创建一同添加的,所以不会报错。

第二次迁移触发报错的原因

当你新增day_3相关字段后执行迁移时,操作是给已存在的、可能已有数据的数据表新增字段。所有非空(默认null=False)字段在数据库层面要求每行都必须有值,你没有给新字段设置默认值的情况下,Django无法确定已有旧记录的新字段应该填入什么内容,因此抛出错误:

You are trying to add a non-nullable field 'day_3_date' to instructor_timesheet without a default; we can't do that (the database needs something to populate existing rows).

常用解决方案

你可以根据自己的业务需求选择以下任意一种方案解决:

  • 给新增的非空字段设置合理的默认值,例如日期字段可以设置default=date.today(需要提前导入from datetime import date),时长字段可以设置default=0,Django会自动用该默认值填充所有旧记录的对应字段。
  • 如果允许该字段为空,可以给字段加上null=True, blank=True参数,旧记录的对应字段会自动设为NULL,后续你可以手动补全数据。
  • 执行python manage.py makemigrations命令时,按照终端提示选择选项1,手动输入一个临时默认值用来填充旧数据,后续如果不需要默认值,可以再修改字段配置重新生成迁移即可。

内容的提问来源于stack exchange,提问作者Bogdan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 02:48:02