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

Django中JSONField存储检查表数据出现重复条目问题求助

Django JSONField存储检查表数据时键值对重复的排查与解决

常见原因及对应解决方案

1. 视图层遍历逻辑嵌套错误

这是最常见的原因:你可能在遍历检查表项目的外层循环中,又嵌套遍历了所有表单字段,导致每处理一个项目就重新写入一遍所有键值对,最终字典的键值对被重复覆盖了item_number次。

错误代码示例:

checksheet_data = {}
items = ChecksheetItem.objects.all()
# 外层遍历所有项目,导致内层每次都重新写入所有字段
for item in items:
    for key in request.POST:
        if key.startswith('status_'):
            item_id = key.split('_')[1]
            checksheet_data[item_id] = request.POST[key]

修复代码:直接遍历表单提交的状态字段,无需外层遍历项目:

checksheet_data = {}
# 只遍历表单中需要的状态字段
for key, value in request.POST.items():
    if key.startswith('status_'):
        item_id = key.split('_')[1]
        checksheet_data[item_id] = value

# 或者用字典推导式简化
checksheet_data = {
    key.split('_')[1]: value
    for key, value in request.POST.items()
    if key.startswith('status_')
}

2. 模板层表单字段name重复

如果模板渲染时,所有检查表项目的状态复选框使用了相同的name属性,表单提交后request.POST中只会保留最后一个选中的值;若你在视图中循环每个项目并将这个值重复写入字典,就会出现所有键对应同一个值且重复多次的情况。

错误模板示例:

{% for item in items %}
    <div>
        {{ item.name }}
        <!-- 所有复选框name相同,导致提交后值被覆盖 -->
        <input type="radio" name="status" value="ok" />OK
        <input type="radio" name="status" value="na" />NA
        <input type="radio" name="status" value="pl" />PL
    </div>
{% endfor %}

修复模板:给每个状态字段的name加上项目的唯一标识(如item.id):

{% for item in items %}
    <div>
        {{ item.name }}
        <!-- name包含item唯一ID,确保每个字段独立 -->
        <input type="radio" name="status_{{ item.id }}" value="ok" />OK
        <input type="radio" name="status_{{ item.id }}" value="na" />NA
        <input type="radio" name="status_{{ item.id }}" value="pl" />PL
    </div>
{% endfor %}

3. 模型保存逻辑重复执行

若你在遍历项目的循环中多次调用模型的save()方法,每次都将同一个checksheet_data字典赋值给字段,会导致打印时看到重复的写入记录(尽管最终数据库中是最后一次的结果,但循环内的打印会重复输出)。

错误保存示例:

instance = Checksheet.objects.get(pk=pk)
items = ChecksheetItem.objects.all()
for item in items:
    # 错误:在循环内重复赋值保存
    instance.checksheet_data = checksheet_data
    instance.save()

修复保存逻辑:收集完所有数据后,一次性赋值并保存:

instance = Checksheet.objects.get(pk=pk)
# 收集完所有状态数据后,仅执行一次赋值和保存
instance.checksheet_data = checksheet_data
instance.save()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 18:33:20