如何配置Django REST Framework中评论所有者与管理员的删除权限
解决评论删除权限配置问题:所有者删自己评论,管理员删所有评论
当前代码存在几个关键问题,导致无法实现需求:
- 视图中
permission_classes = [IsAdminUser, IsOwner]是逻辑与,要求用户同时是管理员和评论所有者才能删除,完全不符合需求 IsOwner的has_permission方法过于宽松,允许所有PUT/DELETE请求跳过基础权限校验,没有验证用户是否已登录perform_delete方法错误调用serializer.save(),删除操作不需要保存数据,逻辑完全错误
以下是修正后的完整代码:
Permissions.py
from rest_framework.permissions import BasePermission, SAFE_METHODS class IsOwnerOrAdmin(BasePermission): def has_permission(self, request, view): # 仅允许已认证用户执行删除操作 return request.user.is_authenticated def has_object_permission(self, request, view, obj): # 安全请求(如GET)允许所有已认证用户访问;删除时,管理员或评论所有者均可操作 if request.method in SAFE_METHODS: return True return request.user.is_staff or obj.user == request.user
Views.py
from rest_framework import generics from .models import CommentModel from .serializers import DeleteCommentSerializer from .permissions import IsOwnerOrAdmin class CommentDeleteView(generics.DestroyAPIView): permission_classes = [IsOwnerOrAdmin] queryset = CommentModel.objects.all() serializer_class = DeleteCommentSerializer def perform_delete(self, obj): # 直接删除目标评论对象 obj.delete()
Serializers.py
from rest_framework import serializers from .models import CommentModel class DeleteCommentSerializer(serializers.ModelSerializer): class Meta: model = CommentModel fields = '__all__'
逻辑说明
- 权限类
IsOwnerOrAdmin:has_permission先校验用户是否已登录,拦截未认证用户的删除请求has_object_permission在删除操作时,判断用户是管理员(is_staff)或者评论的发布者(obj.user == request.user),满足任一条件即可通过校验
- 视图类
CommentDeleteView:- 替换权限类为
IsOwnerOrAdmin,实现“管理员或所有者”的逻辑或关系 - 修正
perform_delete方法,直接调用对象的delete()完成删除操作,符合DestroyAPIView的执行逻辑
- 替换权限类为
内容的提问来源于stack exchange,提问作者Jerin Raju
相关产品推荐
相关产品推荐

