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?
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})