Python 在Django Rest中捕获URL参数

Python 在Django Rest中捕获URL参数,python,django-rest-framework,Python,Django Rest Framework,我需要在下面的url中捕获url参数 “/portal/{pk}/portalProject/{pk}” 以下url未指向下面的查看函数。这里怎么了 url.py router = routers.DefaultRouter() router.register(r'movies', MoviesViewSet) router.register(r'project', ClientViewSet) router.register(r'portal', PortalViewSet) router.r

我需要在下面的url中捕获url参数 “/portal/{pk}/portalProject/{pk}”

以下url未指向下面的查看函数。这里怎么了

url.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)

实际上,您并没有在中声明特定的路由。
路由器负责为您创建所有子URL。只需执行
router.register(r'portal',PortalViewSet)
即可为您提供:

  • [.格式]
  • {prefix}/[.format]
  • {prefix}/{methodname}/[.format]-
    @list\u route
    修饰方法
  • {prefix}/{lookup}/[.format]
  • {prefix}/{lookup}/{methodname}/[.format]-
    @detail\u route
    修饰方法
因此,除非您想创建自定义路由器,否则您必须将url模式更改为类似于
/portal/{pk}/portalProject/?id={pk}

另外,如果您正在通过
pk
请求
portalProject
,则无需将url嵌套在
/portal/{pk}
下。
portalProject
pk
已经足够具体了。您已经有了一个用于
portalProject
的路由,因此您将有效地获得两种访问相同数据的方法,其中一种方法由于没有充分的理由而变得更加复杂

然而,我相信这正是你想要的:


或者

仅针对像我这样的阅读速度慢的读者:
portalProject
是PortalViewSet类(派生ViewSet)中的一个方法。我找不到任何
DefaultRouter
接受正则表达式作为第一个参数的示例。我假设您不能…?是的,默认路由器不接受Reg EX。我在尝试不同的事情。在这里复制相同的。好的!以防万一,我不知道
DefaultRouter
;)的一些整洁的功能是的,这个url是有效的,但我看到的是,我已经有了PortalProjectViewSet,我希望删除它,并提供一种url/portal/{id}/portalProject/{id}有实际应用吗?谢谢链接。还有别的办法吗?我不想安装额外的包。我不认为django rest框架是为这种嵌套而设计的。显然,这是可能的,但它总是比仅仅按照标准做更多的工作。以下是另一种方法:
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)
    ...