2015-05-23 89 views
5

在我的代碼中,我有一個用戶的視圖。 我想要只允許讀取操作(/用戶/ 42/用戶/)ReadOnlyModelViewSet做得很好。django rest框架 - 使用detail_route和detail_list

另外,我想有一個/用戶/註冊 URL,我可以POST,以便註冊一個新用戶。

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

    @list_route(methods=['post']) 
    def register(request): 
     serializer = UserSerializer(data=request.DATA) 
     if serializer.is_valid(): 
      user = User.objects.create_user(
       username = serializer.init_data['username'], 
       password = serializer.init_data['password'], 
      ) 

      return Response(serializer.data, status=status.HTTP_201_CREATED) 
     else: 
      return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

幾個問題:

  • 請問這該是這樣做的正確方法?

  • 是否有一個具體簽名一種方法,如果我把它放在一個list_routedetail_route裝飾?因爲在detail_route例子其始終方法相同的簽名:METHOD_NAME(個體經營,要求,PK =無):

的感謝!

回答

7

你的代碼幾乎是正確的,你只是缺少對寄存器方法正確的簽名:

def register(self, request): 

這是根據the documentation正確的簽名。此外the tests表明,它是不可能通過路由一個額外的參數,那PK總是會過去了一個@detail_route,所以你就必須有:

@detail_route 
def register(self, request, pk=None): 

查看詳細路線和

@list_route 
def register(self, request): 
列表路線的

不過我建議你趁內置ViewSetMixins as ModelViewSet does internally

from rest_framework import exceptions, mixins 
class UserViewSet(mixins.CreateModelMixin, 
       mixins.RetrieveModelMixin, 
       mixins.ListModelMixin, 
       GenericViewSet): 
    queryset = User.objects.all() 
    serializer_class = UserSerializer 
    def create(self, request): 
     serializer = UserSerializer(data=request.DATA) 
      if serializer.is_valid(): 
       user = User.objects.create_user(
        username = serializer.init_data['username'], 
        password = serializer.init_data['password'], 
       ) 

       return Response(serializer.data, status=status.HTTP_201_CREATED) 
      else: 
       return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

對於一般的用戶登錄窗口,您還可以看看django-registration-restframework這我目前正在做的工作爲我的項目。

就我個人而言,我依賴於我的項目中的ModelViewSet,並確保只有正確授權的用戶才能執行某些操作。爲此,您可以使用型號範圍permissions或與django guardian對象特定權限組合使用。

尤其是對於REST API,您最終會想到某些用戶只需對某些對象執行操作,而無需對每個請求進行微操縱。對象級權限在這裏非常有用。

+1

感謝您的回答,我會來看看。一個問題 - ModelviewSet允許GET,POST,PATCH,GET和DELETE。當你重寫更新方法並引發一個NotAllowed時 - 只對POST和PATCH有用嗎?還是爲DELETE?我的意思是它涵蓋除GET和POST之外的所有方法來創建?只是想確保我只允許使用理想的方法 –

+0

你是絕對正確的。我修改了代碼以明確使用正確的mixin,而不是將修補代碼修補出來。 –