Vidya
Vidya

Reputation: 8197

Capturing URL params in Django Rest

I need to capture the url params in the following url "/portal/{pk}/portalProject/{pk}"

the following url is not leading to the view function below . What is wrong here?

urls.py

router = routers.DefaultRouter()
router.register(r'movies', MoviesViewSet)
router.register(r'project', ClientViewSet)
router.register(r'portal', PortalViewSet)
router.register(r'portal/(?P<portal_pk>\d+)/portalProject/(?P<portalProject_pk>\d+)/$', PortalViewSet, 'portalProject')
router.register(r'portalProject', PortalProjectViewSet)

views.py

class PortalViewSet(viewsets.ModelViewSet):
    ...
    @detail_route(methods=['post','get'])
    def portalProject(self, request, pk=None):
        print "in here"
        if request.method == 'post':
            #some code            
            serializer = PortalProjectSerializer(data=request.data)
            if serializer.is_valid():
                print "valid"
                serializer.save()
                return Response(status=status.HTTP_200_OK)
            else:
                print serializer.errors
                return Response(status=status.HTTP_400_BAD_REQUEST)
        else:
            #some code
            return Response(status=status.HTTP_200_OK)
    ...

Upvotes: 2

Views: 4701

Answers (1)

demux
demux

Reputation: 4654

You don't actually declare a specific route in DefaultRouter. The router takes care of creating all sub urls for you. Just doing router.register(r'portal', PortalViewSet) will give you:

  • [.format]
  • {prefix}/[.format]
  • {prefix}/{methodname}/[.format] - @list_route decorated method
  • {prefix}/{lookup}/[.format]
  • {prefix}/{lookup}/{methodname}/[.format] - @detail_route decorated method

So unless you want to create a custom router, you're gonna have to change your url pattern to something like /portal/{pk}/portalProject/?id={pk}

Also, if you're requesting the portalProject by pk anyway, then there is no need for nesting the url under /portal/{pk}. The pk of portalProject is already specific enough. You already have a route for portalProject, so you would effectively be getting two ways of accessing the same data, one of them being more complicated for no good reason.

However, I believe this is what you're looking for:
https://github.com/alanjds/drf-nested-routers
or https://chibisov.github.io/drf-extensions/docs/#nested-routes

Upvotes: 3

Related Questions