lwin
lwin

Reputation: 4460

Url for custom method in django apiview

I am new in Django and I am bit confused in Django apiview for custom method. In ApiView, How can I create a custom method and How to call from axios.

For example

Here is my View

class TimeSheetAPIView(APIView):    

    @action(methods=['get'], detail=False)    
    def getbytsdate(self, request):
        return Response({"timesheet":"hello from getbydate"})

    def get(self,request,pk=None):
        if pk:
            timesheet=get_object_or_404(TimeSheet.objects.all(),pk=pk)
            serializer = TimeSheetSerializer(timesheet)
            return Response({serializer.data})
        timesheet=TimeSheet.objects.all()
        serializer = TimeSheetSerializer(timesheet,many=True)
        return Response({"timesheet":serializer.data})

Here is my URL=>

    url(r'^timesheets_ts/(?P<pk>\d+)/$', TimeSheetAPIView.as_view()),
    url(r'^timesheets_ts/', TimeSheetAPIView.as_view()),

Normally my url would be like=>

api/timesheet_ts/

this one will get all of my records.

So my question is how can I setup URL for getbytsdate or getbyname or other some kind of custom get method? and how can I call?

I tried like this way=>

url(r'^timesheets_ts/getbytsdate/(?P<tsdate>[-\w]+)/$', TimeSheetAPIView.as_view()),

and I called like that

api/timesheets_ts/getbytsdate/?tsdate='test'

Its not work.

So please can u explain for the custom method in apiview and url setting?

Upvotes: 2

Views: 6253

Answers (1)

cagrias
cagrias

Reputation: 1847

In addition to your implementation, you just need to show your custom get request to your urls.py. Edit your urls.py as follows:

# urls.py

timesheet_getbytsdate_detail = TimeSheetAPIView.as_view({'get': 'getbytsdate'})
timesheet_detail = TimeSheetAPIView.as_view({'get': 'retrieve'})

urlpatterns = [
    url(r'^timesheets_ts/getbytsdate/(?P<tsdate>[-\w]+)/$', getbytsdate_detail),
    url(r'^timesheets_ts/(?P<pk>[0-9]+)/', timesheet_detail),
]

EDIT: You need to use the combination viewsets.GenericViewSet and mixins.RetrieveModelMixin instead of APIVewto get use of that:

class TimeSheetAPIView(viewsets.GenericViewSet, mixins.RetrieveModelMixin):    

    @action(methods=['get'], detail=False)    
    def getbytsdate(self, request):
        return Response({"timesheet":"hello from getbydate"})

    def retrieve(self, request, *args, **kwargs):
        timesheet=self.get_object()
        serializer = TimeSheetSerializer(timesheet)
        return Response({serializer.data})
        timesheet=TimeSheet.objects.all()
        serializer = TimeSheetSerializer(timesheet,many=True)
        return Response({"timesheet":serializer.data})

Upvotes: 5

Related Questions