2017-06-10 64 views
0

可以說我有以下視圖集:DRF - 從URL過濾器代替查詢參數

class UserViewSet(viewsets.ReadOnlyModelViewSet, viewsets.GenericViewSet): 
    queryset = User.objects.all() 
    serializer_class = UserSerializer 

router.register(r'users', UserViewSet) 

我可以打我的API /用戶/端點得到所有用戶。

我也希望能夠通過使用/公司/ {COMPANY_ID}列出一個公司的用戶/用戶

我想創建一個新的端點,它會重用我list方法,但篩選查詢集不同。 我的想法是註冊此路線來調用另一種方法,可以說list_by_company,它的kwargs中將有company_id

如何在DRF路由器類中註冊?

我也歡迎有關如何實現此過濾的其他想法,但我不想使用查詢參數,因爲從長遠來看它有點混亂。

回答

0

我發現我可以擴展defaultrouter中並添加不正是我想要的條目:

class UserRouter(routers.DefaultRouter): 
    routes = [ 
     routers.Route(
      url=r'^{prefix}{trailing_slash}$', 
      mapping={'get': 'list'}, 
      name='{basename}-list', 
      initkwargs={'suffix': 'List'} 
     ), 
     routers.Route(
      url=r'^companies/(?P<company_id>[0-9]+)/{prefix}{trailing_slash}$', 
      mapping={'get': 'list'}, 
      name='{basename}-list', 
      initkwargs={'suffix': 'List'} 
     ), 
     routers.Route(
      url=r'^{prefix}/{lookup}$', 
      mapping={'get': 'retrieve'}, 
      name='{basename}-detail', 
      initkwargs={'suffix': 'Detail'} 
     ), 
    ] 

然而,這是一個有點冗長,因爲我重寫默認路由了。

然後,我可以添加路由器的DRF路由器直接,這是短:

router = routers.DefaultRouter() 
router.register(r'users', UserViewSet) 
router.routes.append(
    routers.Route(
     url=r'^companies/(?P<company_id>[0-9]+)/{prefix}{trailing_slash}$', 
     mapping={'get': 'list'}, 
     name='{basename}-list', 
     initkwargs={'suffix': 'List'} 
    ), 
) 

我要使用此解決方案,但我很想知道,如果其他開發人員解決類似案例,在一個不同的方式:)

+0

盧卡斯,對我來說,似乎解決方案很複雜。爲什麼不要有一個不同的端點(視圖集)來表示你需要什麼? DRF的嵌套路線?我認爲維護上面的代碼非常複雜,尤其是代碼庫的非原創開發人員 – DmitrySemenov