如何将Django接收的QueryDict转换为批量插入所需的对象列表
DRF+jQuery实现批量数据插入的格式转换解决方案
你当前的问题核心是前端提交的编码格式和后端预期不匹配:
- DRF自带接口提交的是JSON格式数组,所以
request.data直接是列表格式,适配批量序列化逻辑 - 前端用FormData+
contentType: false提交的是multipart/form-data格式,DRF解析后得到QueryDict,每个字段对应所有行的值的数组,不符合批量序列化要求
方案1:前端调整提交格式(推荐)
该方案无需修改后端原有逻辑,直接提交符合要求的JSON数组即可,适合不需要上传文件的场景:
修改前端提交代码如下:
$(document).on('submit', '#create_tenant_bulk', function (event) { event.preventDefault(); // 提取表单所有字段值,组装为租户对象数组 const nameList = $(this).find('[name="name"]').map((_, el) => el.value).get(); const emailList = $(this).find('[name="email"]').map((_, el) => el.value).get(); const phoneList = $(this).find('[name="phone_number"]').map((_, el) => el.value).get(); const tenants = nameList.map((name, idx) => ({ name: name, email: emailList[idx], phone_number: parseInt(phoneList[idx]) // 数字类型提前转换,避免后端校验报错 })); $.ajax({ method: 'POST', url: '{% url "tenants:tenant-listcreate" %}', data: JSON.stringify(tenants), // 序列化为JSON字符串 contentType: 'application/json', // 明确指定JSON格式 dataType: "json", processData: false, // 补充你的success、error回调逻辑 }) })
提交后后端request.data会直接得到预期的对象数组,原有代码逻辑无需修改即可正常完成批量插入。
方案2:后端转换QueryDict格式
如果前端需要上传文件(必须用FormData提交),或者不方便修改前端代码,可以在后端新增QueryDict转对象数组的逻辑,修改create方法代码如下:
class CreateTenantAPIView(generics.ListCreateAPIView): queryset = Tenant.objects.all() serializer_class = TenantSerializer def create(self, request, *args, **kwargs): data = request.data # 判断是否为QueryDict格式,是的话转换为对象数组 if not isinstance(data, list): # 校验所有字段的数组长度一致 field_values = list(data.values()) if not field_values: return Response({"error": "未提交有效数据"}, status=400) tenant_count = len(field_values[0]) if any(len(val) != tenant_count for val in field_values): return Response({"error": "各字段提交数量不匹配"}, status=400) # 组装对象数组 data = [ { field: data[field][index] if field != "phone_number" else int(data[field][index]) for field in data.keys() } for index in range(tenant_count) ] many = isinstance(data, list) serializer = self.get_serializer(data=data, many=many) if serializer.is_valid(raise_exception=True): serializer.save(added_by=self.request.user) return Response({ 'success': '租户已添加成功', }) return Response({ 'error': '数据提交有误', 'error_list':serializer.errors.items() })
注意:代码中对phone_number字段做了类型转换,你可以根据自己实际的字段类型要求调整转换逻辑
内容的提问来源于stack exchange,提问作者Joseph Disraeli Omenda
相关产品推荐
相关产品推荐

