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

Python操作SQL表上传文档时如何彻底移除多余未使用字段

问题描述

数据库存储示例
现有存储业务数据的SQL表,当前上传2份文档时,数据会写入doc0、doc1字段,其余未上传的doc字段会被赋值为null保留在记录中。期望实现逻辑:仅上传N份文档时,其余未使用的doc字段需要从对应SQL记录中彻底移除,不保留值为null的字段。

原有实现代码
def submit_quality_dept_application(request, application_id):
n = int(request.data['length'])
application = Application.objects.get(id=application_id)
application_state = application.application_state
teaching_feedback = request.FILES['teaching-feedback']
application_state['teaching_feedback'] = teaching_feedback.name
now = datetime.now()
dt_string = now.strftime("%Y-%m-%d %H:%M:%S")
application_state['edited_time'] = dt_string
for i in range(5):
    application_state[f'doc{i}'] = None
for i in range(n):
    doc = request.FILES[f'doc{i}']
    application_state[f'doc{i}'] = doc.name
    copy_to_application_directory(doc, application.id)
copy_to_application_directory(teaching_feedback, application.id)
ApplicationStep.objects.update_or_create(
    application=application, step_name=Step.STEP_7
)
Application.objects.filter(id=application_id).update(application_state=application_state)
return Response(n, status=status.HTTP_200_OK)
修改方案

问题出在原有代码的字段赋值逻辑:先循环把doc0到doc4共5个字段全部赋值为None,再给前n个有实际上传的doc字段覆盖为文件名,最终剩下的5-n个字段就会以null值的形式留在存储结构中,写入数据库后就会保留这些null字段。

调整逻辑即可解决:不要先给所有doc字段赋值None,而是先把application_state中所有已存在的doc类字段全部删除,再仅为实际上传的n个doc字段赋值文件名,最终存储结构里就只会保留有实际值的doc字段,不会残留多余的null字段。

修改后的代码如下:

def submit_quality_dept_application(request, application_id):
    n = int(request.data['length'])
    application = Application.objects.get(id=application_id)
    application_state = application.application_state
    teaching_feedback = request.FILES['teaching-feedback']
    application_state['teaching_feedback'] = teaching_feedback.name
    now = datetime.now()
    dt_string = now.strftime("%Y-%m-%d %H:%M:%S")
    application_state['edited_time'] = dt_string
    # 清除所有历史doc字段,避免残留旧值或null字段
    for i in range(5):
        doc_key = f'doc{i}'
        if doc_key in application_state:
            del application_state[doc_key]
    # 仅为实际上传的文档写入对应字段
    for i in range(n):
        doc = request.FILES[f'doc{i}']
        application_state[f'doc{i}'] = doc.name
        copy_to_application_directory(doc, application.id)
    copy_to_application_directory(teaching_feedback, application.id)
    ApplicationStep.objects.update_or_create(
        application=application, step_name=Step.STEP_7
    )
    Application.objects.filter(id=application_id).update(application_state=application_state)
    return Response(n, status=status.HTTP_200_OK)

注:该方案适配Django框架JSONField类型的application_state字段,删除无对应上传文件的doc键后,存入数据库的JSON结构将不会保留这些冗余字段。如果后续文档上传上限调整,只需修改循环中range(5)的参数为对应最大值即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 19:31:41