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

