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

