在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币余额
- 我的收藏
- 我的下载
- 下载帮助
评论0