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

Django REST Framework如何实现QuerySet的区间范围过滤?

实现方案

我们通过拆分单值参数为上下限参数,配合Django ORM的范围查找后缀实现区间过滤,具体调整如下:

1. 接口参数约定

前端传参时改为传递对应参数的最小值、最大值:

  • model_param_1_min:参数1的最小值(可选,不传则不限制下限)
  • model_param_1_max:参数1的最大值(可选,不传则不限制上限)
  • model_param_2_min:参数2的最小值(可选)
  • model_param_2_max:参数2的最大值(可选)

例如筛选model_param_1介于1到10之间,请求URL格式为:/your-api-path?model_param_1_min=1&model_param_1_max=10

2. 调整view.py代码

class ModelsViewSet(ReadOnlyModelViewSet, GenericViewSet):
    serializer_class = ModelsSerializer

    def get_queryset(self):
        # 提取上下限参数
        param1_min = self.request.query_params.get('model_param_1_min')
        param1_max = self.request.query_params.get('model_param_1_max')
        param2_min = self.request.query_params.get('model_param_2_min')
        param2_max = self.request.query_params.get('model_param_2_max')

        filters = {}
        # 构造参数1的过滤条件
        if param1_min:
            filters['model_water_flow_data1__model_param_1__gte'] = param1_min
        if param1_max:
            filters['model_water_flow_data1__model_param_1__lte'] = param1_max
        # 构造参数2的过滤条件
        if param2_min:
            filters['model_water_flow_data2__model_param_2__gte'] = param2_min
        if param2_max:
            filters['model_water_flow_data2__model_param_2__lte'] = param2_max

        queryset = MainModel.objects.all()
        if filters:
            queryset = queryset.filter(**filters)
        return queryset

可选优化(参数合法性校验)

可以增加参数类型转换逻辑,避免非数字参数导致的查询报错:

# 示例:参数1最小值的校验逻辑
if param1_min:
    try:
        param1_min = float(param1_min)
        filters['model_water_flow_data1__model_param_1__gte'] = param1_min
    except ValueError:
        # 非法参数可以直接忽略或者返回错误提示,根据业务需求调整即可
        pass

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 05:00:00