django-rest-framework

Django REST framework set parameter for action and show in schema


For example I have an action in my viewset:

class TaskResultViewSet(viewsets.ModelViewSet):
    queryset = TaskResult.objects.all()
    serializer_class = TaskResultSerializer

    @action(methods=['get'], detail=False,)
    def find(self, request):
        """find a task result by taskid"""
        queryset = TaskResult.objects.all()
        task_id = request.GET.get("task_id", "")
        user = get_object_or_404(queryset, task_id=task_id)
        serializer = self.serializer_class(user)
        return Response(serializer.data)

It really works with url like http://127.0.0.1:8008/taskmanger/api/result/find/?task_id=eb4dab52-0510-4db1-bd91-61404d538edf.

But in schema generated by python manage.py generateschema > schema.yml, of course I can only get:

  /taskmanger/api/result/find/:
    get:
      operationId: findTaskResult
      description: find a task result by taskid
      parameters: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TaskResult'
          description: ''
      tags:
      - taskmanger

Parameter task_id is missing.

How can I put it into the schema?


Solution

  • You can use https://drf-spectacular.readthedocs.io/en/latest/ for that and many other schema related things:

    from drf_spectacular.utils import OpenApiParameter, extend_schema
    from rest_framework import viewsets
    from rest_framework.decorators import action
    from rest_framework.response import Response
        
    
    class MyViewSet(viewsets.ModelViewSet):
        ...
    
        @extend_schema(
            parameters=[
                OpenApiParameter(name="param_1", type=str)
            ]
        )
        @action(detail=False, methods=["get"])
        def my_action(self, request):
            param_1 = request.query_params.get("param_1")
        
            return Response({"param_1": param_1})