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

