2015-10-19 57 views
0

這是我的路由器/網址:DjangoRestFramework - 只有在request.user正在查看自己的用戶對象時纔可以允許某些請求?

我只希望用戶能夠PUT,POST,PATCH和DELETE如果request.user是他自己的用戶對象。我的意思是,如果一個用戶進入這個網址

users/1 

然後DRF查找如果用戶不request.user,那麼我不希望允許request.user到其PK爲1的用戶能夠POST,PUT,PATCH或DELETE。如果用戶是request.user,那麼我想允許這些請求。有什麼辦法可以做到這一點?我使用的是Viewset,我希望我可以繼續使用Viewset來實現這一點。

回答

2

完成此操作的代碼實際上位於文檔頁面this section的底部。在這裏引用一下:

@detail_route(methods=['post'], permission_classes=[IsAdminOrIsSelf]) 
def set_password(self, request, pk=None): 
    ... 

對於工作,你會希望通過文檔的Authentication and permission部分,尤其是涉及associating data with a particular user的部分,這表明覆蓋默認perform_create視圖的方法來添加一個owner閱讀參數:

def perform_create(self, serializer): 
    serializer.save(owner=self.request.user) 

響應於下面的評論:

perform_create方法屬於GenericAPIView類,其具有以下功能(從here引用:)

此類擴展REST框架的APIView類,添加了對標準列表和詳細視圖通常所需的行爲。

提供的每個具體通用視圖都是通過將GenericAPIView與一個或多個mixin類相結合而構建的。

perform_create是屬於這個泛型類的函數。再次引述same section of the docs

保存和刪除鉤:

由混入類提供下面的方法,以及提供該對象的容易壓倒一切的保存或刪除行爲。

  • perform_create(self, serializer) - 保存新對象實例時調用CreateModelMixin
  • ...

所以,perform_create方法沒有除了提供一個簡單的方法來修改創建新對象時,會發生什麼目的。

+0

謝謝。快速問題,「IsAdminOrIsSelf」的文檔在哪裏?我試着看這裏:http://www.django-rest-framework.org/api-guide/permissions/,它不在那裏。任何想法,我可以找到它?我最初通過「APIGuide」讀取「權限」來查找該權限,但沒有找到它,這是我決定發佈該問題的時間。 – user2719875

+1

@ user2719875 - 你知道,我試圖找到一個完全相同的問題的答案,同時查看這個並找不到任何東西。我能做的最好的就是指向[源代碼](https://github.com/sebastibe/django-rest-skeleton/blob/master/api/users/permissions.py);這很簡單,也許這將是有用的。 – eykanal

+0

我很難理解perform_create做什麼。 perform_create是視圖類的一種方法。它在「serializer.save()」(在視圖中)執行後立即調用。然後它會執行「serializer.save(owner = self.request.user)」。所有者現在傳遞給序列化器的「create()」方法,但爲什麼甚至需要?在文檔中的「與特定用戶關聯數據」部分中,create()方法甚至未被編輯爲使用owner參數。這不會引發一個錯誤,說「期望2個位置參數(request和validated_data),但給出了3個?」 – user2719875

相關問題