Django Save方法添加新记录报错:Field 'id'期望数字却得到空值
问题分析与解决
问题根源
你遇到的报错来自两个核心问题:
- 复用实例导致更新而非创建:循环外仅创建了一个
LearningPathDetail实例,第一次save()后该实例已被赋予自动生成的id。后续循环调用save()时,Django会尝试更新这条已存在的记录,而非创建新记录。 - id字段类型不匹配:Django模型默认的
id是整数类型的AutoField,你手动赋值空字符串""违反了字段类型要求,直接触发类型错误。而且完全不需要手动设置id,Django会自动为新记录分配主键值。
修正后的代码
把实例创建逻辑放到循环内部,每次循环生成新的LearningPathDetail对象:
pos_in_path = 1 lesson_ids = request.POST["lesson_ids"].split(",") for lesson_id in lesson_ids: lp_detail = LearningPathDetail() # 每次循环新建实例 lp_detail.lpheader_id = pk lp_detail.lesson_id = lesson_id lp_detail.pos_in_path = pos_in_path lp_detail.save() # Django自动生成主键id pos_in_path += 1
也可以用更简洁的create()方法直接完成创建+保存:
pos_in_path = 1 lesson_ids = request.POST["lesson_ids"].split(",") for lesson_id in lesson_ids: LearningPathDetail.objects.create( lpheader_id=pk, lesson_id=lesson_id, pos_in_path=pos_in_path ) pos_in_path += 1
补充说明
- 模型实例调用
save()时,若实例无主键值(未保存过的新实例),Django执行INSERT创建新记录;若已有主键值,则执行UPDATE修改现有记录。 - 手动设置
id为空或None属于多余操作,默认主键字段不允许空值且类型为整数,强行赋值只会引发错误。
内容的提问来源于stack exchange,提问作者Matthew Tomsho
相关产品推荐
相关产品推荐

