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
相关产品推荐
相关产品推荐

