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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 12:57:02