在Django Rest中捕获URL参数

时间:2016-01-25 04:57:47

标签: python django-rest-framework

我需要捕获以下网址中的网址参数 " /入口/ {PK} / portalProject / {PK}"

以下网址未导致以下视图功能。这有什么不对?

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

1 个答案:

答案 0 :(得分:1)

您实际上并未在DefaultRouter中声明特定路线。 router负责为您创建所有子网址。只需执行router.register(r'portal', PortalViewSet)即可:

  • [格式]
  • {前缀} / [格式]
  • {prefix} / {methodname} / [.format] - @list_route装饰方法
  • {前缀} / {查找} / [格式]
  • {prefix} / {lookup} / {methodname} / [.format] - @detail_route装饰方法

因此,除非您想要创建自定义路由器,否则您必须将您的网址格式更改为/portal/{pk}/portalProject/?id={pk}

此外,如果您仍然portalProject pk请求/portal/{pk},则无需在pk下嵌套网址。 portalProject的{​​{1}}已足够具体。您已经有了portalProject的路由,因此您实际上可以通过两种方式访问​​相同的数据,其中一种方法更加复杂,没有充分的理由。

但是,我相信这就是你要找的东西:
https://github.com/alanjds/drf-nested-routers
https://chibisov.github.io/drf-extensions/docs/#nested-routes