我需要在以下网址中捕获网址参数 “/门户/{pk}/portalProject/{pk}”
下面的 url 没有指向下面的 View 函数。这里有什么问题?
网址.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)
View .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)
...
请您参考如下方法:
您实际上并未在 DefaultRouter 中声明特定路线. router 负责为您创建所有子 url。只需执行 router.register(r'portal', PortalViewSet) 即可:
- [.格式]
- {前缀}/[.格式]
- {prefix}/{methodname}/[.format] -
@list_route修饰方法 - {前缀}/{查找}/[.格式]
- {prefix}/{lookup}/{methodname}/[.format] -
@detail_route修饰方法
因此,除非您想创建一个自定义路由器,否则您将不得不将您的 url 模式更改为类似 /portal/{pk}/portalProject/?id={pk}
此外,如果您无论如何都通过pk 请求portalProject,则无需将url 嵌套在/portal/{pk} 下。 portalProject 的pk 已经足够具体了。您已经有了 portalProject 的路由,因此您将有效地获得两种访问相同数据的方法,其中一种无缘无故地变得更加复杂。
不过,我相信这就是您要找的:
https://github.com/alanjds/drf-nested-routers
或 https://chibisov.github.io/drf-extensions/docs/#nested-routes
