我相信這是相當直接的,但我已經搜遍了文檔,我無法弄清楚如何做到這一點。對象級權限
我已將我的User
類擴展爲與其他用戶有兩個ManyToMany關係:trainers
和teammates
。
如果用戶擁有的對象(由user
ForeignKey的上模型中定義的),則該用戶應該能夠GET
,POST
,PUT
,PATCH
,和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,如果我嘗試訪問我不應該訪問的詳細視圖。我瞭解爲什麼發生這種情況,但有沒有辦法解決它?