2017-01-31 38 views
0

我所做的(工作)

ModelViewSetDynamicListRoute使用自定義路由器 - Django的REST框架

class UserViewSet(viewsets.ModelViewSet): 
    """ 
    A viewset for viewing and editing user instances. 
    """ 
    permission_classes = [IsAuthenticated, IsUser] 
    serializer_class = UserSerializer 
    queryset = User.objects.all() 

    @list_route(methods=['GET','PUT']) 
    def me(self, request, *args, **kwargs): 
     self.kwargs.update(pk=request.user.id) 
     if request.method == 'GET': 
      return self.retrieve(request,*args, **kwargs) 
     else: 
      return self.update(request,*args, **kwargs) 

注:

  • UserSerializer是用戶一個簡單的ModelSerializer目的。
  • IsUser是一個允許類,驗證是否obj.id == request.user.id

SimpleRouter

router = SimpleRouter(trailing_slash=False) 
router.register(r'users', UserViewSet) 

urlpatterns += router.urls 

注:

  • 的路徑不從這裏開始,但我會假設它是爲了命名端點。

所以,現在我已經得到了基本上所有的常規終點在SimpleRouter Documentation描述的路線,再加上:

  • URL風格:users/me
  • HTTP方法:GET和PUT(如指定通過methods參數)
  • 行動:me@list_route飾法)
  • URL名稱:user-me

我的要求

  • GET /users/me返回JSON編碼用戶對象。
  • PUT /users/me更新用戶對象並返回更新的JSON編碼的用戶對象。

我想要什麼(不工作)

我不需要,不想要的,由SimpleRouter創建的所有路由。

定製路由器

class CustomRetrieveUpdateRouter(SimpleRouter): 
    routes = [ 
     Route(
      url=r'^{prefix}/{lookup}{trailing_slash}$', 
      mapping={'get': 'retrieve'}, 
      name='{basename}-detail', 
      initkwargs={'suffix': 'Detail'} 
     ), 
     Route(
      url=r'^{prefix}/{lookup}{trailing_slash}$', 
      mapping={'put': 'update'}, 
      name='{basename}-detail', 
      initkwargs={'suffix': 'Detail'} 
     ), 
     DynamicListRoute(
      url=r'^{prefix}/{methodname}{trailing_slash}$', 
      name='{basename}-{methodnamehyphen}', 
      initkwargs={} 
     ) 
    ] 

我的要求

  • GET /users/me返回以下JSON體:{"detail":"Not found."}404錯誤代碼。
  • PUT /users/me返回以下JSON正文:{"detail":"Method \"PUT\" not allowed."}405錯誤代碼。

注:

在調試,如果我這樣做,返回404的請求,HTML頁面會顯示以下可用端點:

  • ^users/(?P<pk>[^/.]+)$ [name='user-detail']
  • ^users/(?P<pk>[^/.]+)$ [name='user-detail']
  • ^users/me$ [name='user-me']

我忘了什麼?

+0

你是什麼意思「我可以打電話../users/me」?你可以說得更詳細點嗎 ? – Linovia

+0

當我對該端點執行GET請求時,會收到一個200響應,並帶有相應的JSON – NBajanca

回答

1

看起來你在路線上有衝突。

^users/(?P<pk>[^/.]+)$應該抓住「/ users/me」,因此它不會有機會打你的具體觀點。

要麼將​​pk url kwargs regexp設置爲更具體的內容(如id整數),要麼在另外兩個Route之前設置DynamicListRoute。

相關問題