2014-09-18 52 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