Python 在Django Rest中捕获URL参数
我需要在下面的url中捕获url参数 “/portal/{pk}/portalProject/{pk}” 以下url未指向下面的查看函数。这里怎么了 url.pyPython 在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
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)
...