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

如何用单个函数实现基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 09:35:04