2014-09-18 25 views
4

我在使用@detail_route on viewsets.ModelViewSet。Django Rest框架 - @detail_route的详细信息页面

class CompanyViewSet(viewsets.ModelViewSet): 
    queryset = Company.objects.all() 
    serializer_class = serializers.CompanySerializer 

    @detail_route(methods=['get', ], permission_classes=[IsCompanyUserPermission, ]) 
    def accounts(self, request, pk): 
    ... 
    return Response(...) 

# urls.py 
router.register(r'companies', views.CompanyViewSet) 

此代码创建网址:

/companies/ 
/companies/{id} 
/companies/{id}/accounts 

我不知道如何路由/视图添加到明细科目:

/companies/{id}/accounts/{id_account} 

有什么办法增加航线和意见处理这条路?

(将在CompanyViewSet添加这个是最好的选择)

干杯,

回答

7

DRF自身不处理嵌套的路线,你可以通过手工处理或使用的扩展,像drf-nested-routers,但其过时。

我的建议:不要打架构,DRF不善于使用url嵌套的资源,以另一种方式去做。

+0

搞笑的是,这是一个公认的upvoted通过只是说你应该__do它的另一个way__但没有别的办法回答...建议 – surfer190 2017-09-07 08:45:23

+1

@ surfer190“处理它手动“是一种实际的解决方案。 “不要对抗框架”是一个建议,以避免在没有这个功能的框架内放松日子。 PS和最重要的:这是唯一的答案,直到昨天 – 2017-09-08 09:57:05

+0

我的道歉,如果我觉得很粗鲁。所以当你说手工处理时,你的意思是从'APIView'扩展并创建自定义url。 – surfer190 2017-09-08 10:08:37

2

所以,当你可以避开它,但有时是有意义的巢资源或方法

所以对于你的情况来处理双方的accounts/ URL和accounts/{account_id}定义另一个细节的路线。

您已经定义了一个accounts所以你只需要添加另一个函数以不同的名称,并确保添加url_path这样你就可以得到account_id变量。

 @detail_route(methods=['get', ], permission_classes=[IsCompanyUserPermission, ]) 
     def accounts(self, request, pk): 
     ... 
     return Response(...) 

     @detail_route(methods=['get', ], permission_classes=[IsCompanyUserPermission, ], 
         url_path='^queues/(?P<account_id>[0-9]+)') 
     def account_detail(self, request, pk, account_id): 
     ... 
     return Response(...) 

这个答案了this similar answer作为参考

+1

尼斯:),在我自己的回答/挣扎时,'url_path' [did not exist](http://www.django-rest-framework.org/topics/release-notes/#303)。没有时间从现在开始测试。 OP反馈欢迎! – 2017-09-08 10:02:03

+0

叶你说得对,它不存在。 – surfer190 2017-09-08 10:06:44