Django DRF ModelViewSet含/id/端点权限拒绝问题求助
问题解决:Address ModelViewSet详情端点权限错误
问题根源
你使用~IsSeller的方式不符合DRF权限系统规范,DRF需要接收BasePermission子类的实例作为权限校验逻辑,直接对权限类取反无法生成有效的权限判断规则。虽然列表(LIST)和创建(CREATE)端点碰巧通过了验证,但带id的详情类端点(GET/PUT/PATCH/DELETE)会触发完整的权限校验流程,导致验证失败。
解决方案
步骤1:创建NotSeller权限类
修改permissions.py,新增专门的非卖家权限判断类:
from rest_framework.permissions import BasePermission class IsSeller(BasePermission): def has_permission(self, request, view): return request.user and request.user.is_seller class NotSeller(BasePermission): def has_permission(self, request, view): # 验证用户已登录且不是卖家 return request.user and not request.user.is_seller def has_object_permission(self, request, view, obj): # 额外验证地址属于当前用户,防止越权操作他人地址 return obj.user == request.user and not request.user.is_seller
步骤2:更新视图的权限配置
修改views.py中的permission_classes,替换错误的取反写法:
class ManageAddressViewSet(viewsets.ModelViewSet): serializer_class = AddressSerializer # 使用NotSeller替代~IsSeller permission_classes = [permissions.IsAuthenticated, permissions.NotSeller] queryset = Address.objects.all() def get_queryset(self): return self.queryset.filter(user=self.request.user) def perform_create(self, serializer): return serializer.save(user=self.request.user)
额外说明
has_object_permission方法用于对象级权限校验,和get_queryset的过滤逻辑形成双重保障,彻底避免用户越权访问他人地址。- 原
~IsSeller的写法会导致权限逻辑混乱,必须替换为明确的权限类实现才能稳定生效。
内容的提问来源于stack exchange,提问作者Naman Arora
相关产品推荐
相关产品推荐

