2017-05-31 317 views
0

我相信這是相當直接的,但我已經搜遍了文檔,我無法弄清楚如何做到這一點。對象級權限

我已將我的User類擴展爲與其他用戶有兩個ManyToMany關係:trainersteammates

如果用戶擁有的對象(由user ForeignKey的上模型中定義的),則該用戶應該能夠GETPOSTPUTPATCH,和DELETE。我已經用ModelViewSet設置了這些端點。如果用戶是所有者的培訓者,他們應該擁有相同的權限。如果用戶是業主的隊友,他們應該只能夠GET

在這些對象的列表視圖中,用戶應該只能看到他們擁有的對象以及他們是所有者的教練或隊友的對象。如果他們嘗試訪問物體的細節視圖,但他們不是所有者的朋友或隊友,則應返回403.

我擴展了BasePermission以嘗試創建此行爲 - 然後添加它到我想要這種行爲的ModelViewSet

class TrainerAndOwnerOrTeammate(permissions.BasePermission): 

    def has_object_permission(self, request, view, obj): 
     user = request.user 
     owner = obj.user 

     if user == owner: 
      return True 

     if user in owner.trainers.all(): 
      return True 

     if user in owner.teammates.all(): 
      return request.method in permissions.SAFE_METHODS 

     return False 

由於REST框架文檔指定這不是基於每個對象的基礎上進行列表視圖運行,我推翻get_queryset由請求用戶進行過濾。

現在的問題是我得到一個404錯誤,而不是403,如果我嘗試訪問我不應該訪問的詳細視圖。我瞭解爲什麼發生這種情況,但有沒有辦法解決它?

回答

0

我最終覆蓋了ModelViewSetlist方法並保留權限類。權限類處理了詳細視圖和操作,列表方法處理了列表視圖。

0

我認爲一個解決方案是放下get_queryset()並定義一個自定義過濾器。篩選器類使您可以根據訪問的請求和視圖篩選查詢集。另一種方法是將您的視圖分成多個單獨的視圖。另一種方法是定義get_object。