如何用单个函数实现基于URL参数的Django REST API数据筛选?
实现通用的按类别排序API视图
当然可以实现这种通用函数,核心是建立用户输入的分类名称与数据库字段的映射,再根据传入参数动态处理查询逻辑,具体步骤如下:
1. 建立分类与数据库字段的映射字典
先定义一个字典,把用户友好的分类名称(比如rebounds、assists)映射到数据库表对应的字段名(比如rpg、apg),既能避免直接用用户输入做查询字段的安全风险,也能统一处理字段映射:
CATEGORY_FIELD_MAP = { 'rebounds': 'rpg', 'assists': 'apg', 'points': 'ppg', # 可继续添加其他统计类别及对应字段 }
2. 编写通用的sortBy视图函数
用@api_view(['GET'])装饰器,接收category作为URL参数,先校验参数合法性,再动态构建查询:
from rest_framework.decorators import api_view from rest_framework.response import Response from rest_framework import status from .models import Nba_stats @api_view(['GET']) def sortBy(request, category): """根据传入的统计类别返回排序后的NBA数据""" # 校验传入类别是否在支持范围内 if category not in CATEGORY_FIELD_MAP: return Response( {"error": f"不支持该统计类别:{category},支持的类别有:{list(CATEGORY_FIELD_MAP.keys())}"}, status=status.HTTP_400_BAD_REQUEST ) # 获取对应数据库字段 field_name = CATEGORY_FIELD_MAP[category] # 构建查询:指定返回字段,按对应字段降序排序(用`-字段名`替代reverse()更直观) stats_data = Nba_stats.objects.values_list('name', 'team', field_name).order_by(f'-{field_name}') # 将QuerySet转为列表返回 return Response(list(stats_data))
3. 配置URL路由
在项目的urls.py中添加对应路由,把category作为字符串参数传递给视图:
from django.urls import path from .views import sortBy urlpatterns = [ # 其他路由... path('api/sortby/<str:category>/', sortBy, name='sort-by-category'), ]
补充说明
- 用映射字典而非直接拼接用户输入的字段名,是为了避免SQL注入风险,同时防止用户输入错误字段导致查询报错。
- 如果需要支持升序/降序切换,可以额外加查询参数(比如
?order=asc),在视图中动态调整排序规则。 - 后续新增统计类别时,只需在
CATEGORY_FIELD_MAP中添加对应键值对即可,无需修改视图逻辑。
内容的提问来源于stack exchange,提问作者alecnazzy
相关产品推荐
相关产品推荐

