Skip to main content
 首页 » 编程设计

python之在 Django Rest 中捕获 URL 参数

2025年05月04日23bjzhanghao

我需要在以下网址中捕获网址参数 “/门户/{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