You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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__'

逻辑说明

  1. 权限类IsOwnerOrAdmin:
    • has_permission先校验用户是否已登录,拦截未认证用户的删除请求
    • has_object_permission在删除操作时,判断用户是管理员(is_staff)或者评论的发布者(obj.user == request.user),满足任一条件即可通过校验
  2. 视图类CommentDeleteView:
    • 替换权限类为IsOwnerOrAdmin,实现“管理员或所有者”的逻辑或关系
    • 修正perform_delete方法,直接调用对象的delete()完成删除操作,符合DestroyAPIView的执行逻辑

内容的提问来源于stack exchange,提问作者Jerin Raju

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 04:57:35