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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 05:25:28