亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 django rest 框架中結合 2 個自定義權限

在 django rest 框架中結合 2 個自定義權限

森欄 2022-07-26 20:54:46
我有一個模型Showcase,用戶可以用來展示項目,還有一個協作模型,用戶可以在其中將合作者添加到展示中。我正在嘗試實現一個案例,展示中的管理員和協作中的用戶可以刪除該協作。為了更好地解釋,在展示模型中,有一個管理展示的管理員列表。他們還可以將合作者(通過Collaborator模型)添加到展示中。有Collaborator一個用戶字段,即為展示做出貢獻的用戶。我希望在添加協作者后,該用戶可以刪除自己(如果他不想成為展示的一部分),或者管理員可以刪除該協作者(如果添加了錯誤的用戶并想要刪除那個櫥窗里的他)models.pyclass Showcase(models.Model):    title = models.CharField(max_length=50)    description = models.TextField(null=True)    skill_type = models.ForeignKey(Skill, on_delete=models.CASCADE)    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.DO_NOTHING, related_name="Showcases")    content = models.TextField(null=True)    created_on = models.DateTimeField(auto_now_add=True)    updated_on = models.DateTimeField(auto_now=True)    voters = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name="upvotes")    slug = models.SlugField(max_length=255, unique=True)    administrator = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name="administrators", blank=True)class Collaborator(models.Model):    post = models.ForeignKey(Showcase, on_delete=models.CASCADE, related_name="collaborated_showcases")    user = models.ForeignKey(settings.AUTH_USER_MODEL,                             on_delete=models.CASCADE, related_name="collaborators")    skill = models.ForeignKey(Skill, on_delete=models.CASCADE, null=True, related_name="creative_type")    role = models.TextField(null=True)    created_on = models.DateTimeField(auto_now_add=True)    updated_on = models.DateTimeField(auto_now=True)permission.pyclass IsUser(permissions.BasePermission):    def has_object_permission(self, request, view, obj):        if request.method in permissions.SAFE_METHODS:            return False        return obj.user == request.user網path("collaborator/<int:pk>/delete/", qv.CollaboratorDeleteView.as_view(), name="collaborator-delete-view"),現在我已經能夠實現管理員可以刪除協作者,但是我如何為Collaborator模型中的用戶添加另一個權限,以便能夠通過相同的視圖將自己作為協作者刪除?
查看完整描述

2 回答

?
狐的傳說

TA貢獻1804條經驗 獲得超3個贊

實際上,這兩種權限都可以合并為一個。例如像這樣更新權限:


class CanDeleteUser(permissions.BasePermission):


    def has_object_permission(self, request, view, obj):

        if request.method in permissions.SAFE_METHODS:

            return False

        return obj.user == request.user or ob.post.administrator.filter(pk=request.user.pk).exists()

在這里,我正在檢查request.useris或檢查附加變量obj.user的對象的管理員。showcaseobj


現在我只檢查collaborator.


class CollaboratorDeleteView(APIView):

    '''

    Allow Administrators to delete a collaborator to a showcase 

    or allow the collaborator user to be able to delete himself 

    '''

    permission_classes = [CanDeleteUser]


    def delete(self, request, pk):

        collaborator = get_object_or_404(Collaborator, pk=pk)


        try:

            self.check_object_permissions(request, collaborator)


查看完整回答
反對 回復 2022-07-26
?
qq_笑_17

TA貢獻1818條經驗 獲得超7個贊

您可以permission_classses使用 & (and)、| 添加任意數量的權限來賦予屬性 (or) 和 ~ (not) 符號 ( doc ):


class CollaboratorDeleteView(APIView):

    '''

    Allow Administrators to delete a collaborator to a showcase 

    or allow the collaborator user to be able to delete himself 

    '''

    permission_classes = [IsAdmin|IsUser]

這兩個權限現在都可以使用OR邏輯。


查看完整回答
反對 回復 2022-07-26
  • 2 回答
  • 0 關注
  • 96 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號