Reputation: 8197
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
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:
@list_route
decorated method@detail_route
decorated methodSo 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