2016-04-08 61 views
0

我使用Django 1.9和Django的REST框架3.3DRF - 基本視圖集中的查詢參數驗證

我創建三個新的端點是類似的,但仍有足夠的不同,我想他們是自己的viewsets避免凌亂的代碼。他們不支持模型,所以我直接擴展ViewSet。所有三個端點之間的一個相似之處是它們需要相同的兩個查詢參數。所以我發現我是這樣做的:

class MyFirstViewset(viewsets.ViewSet): 

    def list(self, request): 
     some_param = request.query_params.get('someparam') 
     if not some_param: 
      return Response('someparam query parameter is required', status.HTTP_400_BAD_REQUEST) 
     some_other_param = request.query_params.get('someotherparam') 
     if not some_other_param: 
       return Response('someotherparam query parameter is required', status.HTTP_400_BAD_REQUEST) 


class MySecondViewset(viewsets.ViewSet): 

    def list(self, request): 
     some_param = request.query_params.get('someparam') 
     if not some_param: 
      return Response('someparam query parameter is required', status.HTTP_400_BAD_REQUEST) 
     some_other_param = request.query_params.get('someotherparam') 
     if not some_other_param: 
       return Response('someotherparam query parameter is required', status.HTTP_400_BAD_REQUEST) 

正如你所看到的......它不是非常乾燥。一個明顯的解決方案是使用基本視圖集進行類似的驗證部分的繼承,問題是我不確定用DRF做這種事情的最佳做法是什麼。我想創建一個受保護的訪問驗證功能並調用它嗎?但是,如果我所做的只是檢查鍵的字典,它甚至不需要在ViewSet的權利?只需讓最後一個類在list()中進行驗證,那麼在所有子視圖集中調用它也對我來說看起來很奇怪,因爲那時我使用list()來驗證並且實際上不會返回基類中的任何內容。

任何人都可以告訴我這是一個很好的方法嗎?這種情況的最佳做法是什麼?我谷歌搜索,但找不到任何東西。任何意見,將不勝感激。謝謝!爲什麼類的基類是更好

回答

0

原因之一正是你可以看純編碼點添加自己的推導或者至少增加混入,所以,我認爲你應該只是添加自己的MyBaseViewSet,並有MyFirstViewsetMySecondViewset派生自它。

也就是說,考慮覆蓋get_queryset代替list,並使用ListAPIView讓你獲得一些默認的行爲,只是返回一個空數組,或者如果你真的想返回一個錯誤,通過異常:

class MyBaseViewSet(generics.ListAPIView): 
    serializer_class = YourSerializer 
    permission_classes = (permissions.IsAuthenticated,) 

    def get_queryset(self): 
     some_param = self.request.query_params.get('someparam') 
     if not some_param: 
      raise exceptions.PermissionDenied