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

Django REST API通过AJAX传递多列表至URL遇阻求助

解决Django REST APIView接收多列表筛选参数的问题

我来帮你搞定这个问题——你现在的核心问题出在URL参数的拼接格式错误,导致Django根本没法正确解析你传递的参数,自然request.GET拿不到任何内容。下面一步步给你修正:

1. 先修正前端URL的拼接逻辑

你现在的代码里用了两个/?来分隔参数,这完全不符合HTTP查询参数的规范!多个参数应该用&来连接,而且整个URL里只能有一个?用来开启参数部分。

给你写个正确的前端示例:

// 假设你的两个筛选数组
const search_type_list = ['2', '4', '244', '42'];
const parent_list = ['10', '20', '30']; // 示例父ID数组
const projectId = "{{selected_project.id}}"; // Django模板渲染的项目ID

// 正确拼接URL:用&连接多个参数,同时用encodeURIComponent处理特殊字符(可选但推荐)
const url = `/api/dashboard/project_workorder_filter/${projectId}/?search_type_list=${encodeURIComponent(search_type_list.join(','))}&parent_list=${encodeURIComponent(parent_list.join(','))}`;

// 发起AJAX请求(这里用fetch举例,你也可以用jQuery.ajax等)
fetch(url)
  .then(res => res.json())
  .then(data => {
    console.log('筛选结果:', data);
    // 处理返回的数据
  })
  .catch(err => console.error('请求出错:', err));

2. 后端Django APIView的参数解析

在DRF的APIView里,你可以通过request.GET或者DRF推荐的request.query_params来获取参数,然后把逗号分隔的字符串转回列表:

from rest_framework.views import APIView
from rest_framework.response import Response
# 导入你的模型
from .models import Workorder

class ProjectWorkorderFilterView(APIView):
    def get(self, request, project_id):
        # 获取并解析search_type_list参数
        search_type_str = request.query_params.get('search_type_list', '')
        # 处理空值情况,避免split出['']这种无效元素
        search_type_list = search_type_str.split(',') if search_type_str else []
        # 如果需要转成数字类型
        search_type_list = list(map(int, search_type_list)) if search_type_list else []

        # 同样处理parent_list参数
        parent_str = request.query_params.get('parent_list', '')
        parent_list = parent_str.split(',') if parent_str else []
        parent_list = list(map(int, parent_list)) if parent_list else []

        # 执行你的筛选逻辑
        filtered_workorders = Workorder.objects.filter(
            project_id=project_id,
            type__in=search_type_list,
            parent__in=parent_list
        )

        # 返回结果(这里可以序列化后返回)
        return Response({
            'count': filtered_workorders.count(),
            'workorders': [wo.id for wo in filtered_workorders]
        })

额外注意事项

  • 如果你的数组可能为空,一定要处理空字符串的情况,不然split(',')会得到[''],这会导致筛选逻辑出错(比如查询type__in=['']会匹配空字符串的type,而不是忽略这个条件)。
  • 用request.query_params是DRF的推荐写法,和request.GET功能完全一致,但更符合REST框架的设计规范。
  • 如果参数里有特殊字符(比如逗号本身),encodeURIComponent会帮你转义,避免参数解析错误。

内容的提问来源于stack exchange,提问作者M.Izzat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:31:30