在django 采用rest framework开发过程中遇到参数限制,无法自定义参数,只能根据model来定义匹配字段,搜索字段, 排序字段,在实际开发过程中存在根据其他字段来对返回结果做一定限制时,便存在一些不足,根据源码分析,提供自定义查询参数的分为两种 1.在viewset提供的get与get/pk里面添加 from rest_framework import viewsets from rest_framework.schemas import AutoSchema class TaskViewSet(viewsets.ModelViewSet): queryset = T 在使用Django REST Framework开发API时,我们常常需要根据项目需求自定义查询参数,以便能够更灵活地控制数据检索和过滤。默认情况下,Django REST Framework的ModelViewSet仅允许基于模型字段进行操作,但这并不满足所有场景。本文将介绍两种在Django REST Framework中为GET请求添加自定义参数的方法。 ### 方法1:通过`AutoSchema`扩展 **描述**: 在`viewset`的`get`和`get/pk`方法中添加自定义参数的一种方式是通过扩展`AutoSchema`类。你需要导入所需的库: ```python from rest_framework import viewsets from rest_framework.schemas import AutoSchema from rest_framework.compat import coreapi, coreschema ``` 然后,创建一个自定义的`AutoSchema`子类,如`MallViewSchema`,并重写`get_manual_fields`方法,以添加自定义的查询参数: ```python class MallViewSchema(AutoSchema): def get_manual_fields(self, path, method): # 根据路径和方法添加自定义参数 extra_fields = [] if method == 'GET' and path == '/task/': extra_fields = [ coreapi.Field("sss", required=False, location="query", description='Cissty',), ] return super().get_manual_fields(path, method) + extra_fields ``` 接着,在`TaskViewSet`中,将这个自定义的`schema`赋值给`viewset`: ```python class TaskViewSet(viewsets.ModelViewSet): queryset = Task.objects.all() serializer_class = TaskSerializers schema = MallViewSchema() ``` 这种方式适用于需要在多个视图中使用相同自定义参数的情况,但当有特定视图需要不同参数时,可能需要额外的条件判断。 ### 方法2:使用`@action`装饰器 **描述**: 另一种方法是在`@action`装饰器中添加`schema`参数,以控制单个方法的请求参数。这种方法更加灵活,适用于那些只在特定视图方法中使用的自定义参数。 导入必要的库: ```python from rest_framework import viewsets, serializers from rest_framework.schemas import ManualSchema from rest_framework.compat import coreapi, coreschema ``` 然后,创建一个`ManualSchema`实例,定义你的自定义参数: ```python custom_schema = ManualSchema(fields=[ coreapi.Field("first_field", required=True, location="query", schema=coreschema.String()), ]) ``` 接下来,使用`@action`装饰器为某个特定的视图方法添加自定义参数: ```python class TaskViewSet(viewsets.ModelViewSet): queryset = Task.objects.all() serializer_class = TaskSerializers @action(detail=False, methods=['get'], url_path='get_project_platform', schema=custom_schema) def get_project_platform(self, request, *args, **kwargs): # 在这里处理请求,你可以通过request.query_params访问first_field pass ``` 在这个例子中,`first_field`是一个查询参数,可以通过`location="query"`指定,它将在GET请求的URL中以`?first_field=xxx`的形式出现。如果需要在POST请求中传递,可以使用`location="form"`,这样参数将以表单数据的形式提交。 ### 总结 Django REST Framework提供了多种方式来自定义GET请求的参数,这使得开发者可以根据项目需求定制化API的行为。第一种方法是通过扩展`AutoSchema`,全局地为视图集添加自定义参数,而第二种方法则是使用`@action`装饰器,为单个视图方法添加特定的参数。选择哪种方法取决于你的具体需求和代码组织结构。在实际开发中,可以根据项目的规模和复杂性来权衡这两种方法。
- 粉丝: 6
- 资源: 926
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于Go-micro微服务的秒杀系统详细文档+优秀项目+全部资料.zip
- 基于golang实现在线客服系统,包含用户端(h5,微信小程序),客服端(PC),方便跟已有的系统整合。适用于小程序自带的客服系统无法满足或有多端业务需求的情况详细文档+优秀项目+全部资料.zip
- 基于gorillawebsocket封装的websocket库,实现基于系统维度的消息推送,基于群组维度的消息推送,基于单个和多个客户端消息推送详细文档+优秀项目+全部资料.zip
- 基于Go-Zero + Vue3 + TypeScript + Element-Plus开发的简单高效权限管理系统详细文档+优秀项目+全部资料.zip
- 基于Go-Zero Nestjs + Vue3 + TypeScript + Element-Plus开发的简单高效权限管理系统详细文档+优秀项目+全部资料.zip
- linux常用命令大全.txt
- 基于go-zero的影票售卖系统详细文档+优秀项目+全部资料.zip
- 基于Go-Zero + vue-element-admin的前后端分离微服务管理系统的前端模块详细文档+优秀项目+全部资料.zip
- 基于go-zero 框架实现的电商系统的后端服务详细文档+优秀项目+全部资料.zip
- 基于go-zero实现的网盘系统详细文档+优秀项目+全部资料.zip
- 基于go-zero框架数据中台系统详细文档+优秀项目+全部资料.zip
- 基于go-zero和gorm开发的分布式微服务后端权限管理系统脚手架。十分合适新手入手go-zero、gorm、casbin、jwt等。详细文档+优秀项目+全部
- 基于Go的WebSocket直播间推送系统详细文档+优秀项目+全部资料.zip
- 基于Go和GraphQL的微型进销存系统:服务器端(基于Golang,GraphQL,GORM,jwt-go等开发)详细文档+优秀项目+全部资料.zip
- 基于go的自托管博客系统详细文档+优秀项目+全部资料.zip
- 基于go开发的分布式高并发web电商系统详细文档+优秀项目+全部资料.zip
评论0