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

Django Save方法添加新记录报错:Field 'id'期望数字却得到空值

问题分析与解决

问题根源

你遇到的报错来自两个核心问题:

  1. 复用实例导致更新而非创建:循环外仅创建了一个LearningPathDetail实例,第一次save()后该实例已被赋予自动生成的id。后续循环调用save()时,Django会尝试更新这条已存在的记录,而非创建新记录。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:55:24