django rest framework detail_route not working in get method

1.3k views Asked by At

I defined a viewset using ModelViewSet as follow

I tried to redefine the GET method to do something like getting something from celery . but this part of code just won't work , it acts just like a standard API and didn't do what I wrote in the get_job_detail function.

How should I correctly define the "detail_route" function.

views.py

class JobViewSet(viewsets.ModelViewSet):
    queryset = job.objects.all()
    serializer_class = JobSerializer

    @detail_route(methods=['get'])
    def get_job_detail(self, request, pk=None):
        # print('these part wont proceed')
        job_item = self.get_object()
        if job_item.isReady or job_item.isSuccessful:
            return Response(self.serializer_class(job_item).data)
        celeryjob = sometask.AsyncResult(pk)
        celeryjob.get()
        if celeryjob.state == 'SUCCESS':
            job_item.state = celeryjob.state
            job_item.result = celeryjob.result
            job_item.isReady = True
            job_item.isSuccessful = True
            job_item.save()
        if celeryjob.state == 'FAILURE':
            job_item.state = celeryjob.state
            job_item.result = celeryjob.result
            job_item.isReady = True
            job_item.isSuccessful = False
            job_item.save()
        return Response(self.serializer_class(job_item).data)

urls.py

from django.conf.urls import url, include

from apply_api import views
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r'job',views.JobViewSet)

urlpatterns = [
    url(r'^', include(router.urls)),
]
1

There are 1 answers

0
AudioBubble On BEST ANSWER

now your correct url is: /job/<pk>/get_job_detail if you want just: /job/<pk> you don need to use @detail_route just rename your method to the def retrieve(self, request, *args, **kwargs): more details retrievemodelmixin one of the part class of the modelviewset