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

Django DRF POST请求触发DjangoModelPermissionsOrAnonReadOnly报错如何解决

问题原因与解决方法

核心报错原因

你配置的权限类属性名存在拼写错误:DRF规定的权限类配置属性为permission_classes,你的代码中多写了一个s,写成了permissions_classes,导致你定义的permissions.AllowAny规则未生效。DRF会自动使用项目全局配置的默认权限类DjangoModelPermissionsOrAnonReadOnly,而该权限类要求视图必须设置queryset属性或者实现get_queryset()方法,你的视图未满足该要求,因此触发断言错误。

Pylance参数提示说明

request参数未被访问的提示不是触发500错误的原因,是因为你在方法内使用了self.request而不是方法入参中的request对象,导致入参未被调用产生提示,属于代码规范类提示,不影响接口运行。


修复方案

你可以选择以下任意一种方案修复500错误:

  • 方案1(推荐):修正权限属性名,让AllowAny规则生效,直接避免权限类的校验要求
    修改对应代码行:
    # 把原来的permissions_classes改成permission_classes
    permission_classes = (permissions.AllowAny, )
    
    可选同步修改post方法内的调用,消除参数未使用提示:
    # 把data = self.request.data改成
    data = request.data
    
  • 方案2:如果需要保留全局权限规则,不需要单独开放该接口权限,可以给视图增加queryset属性满足权限类要求,不会影响你现有业务逻辑的过滤逻辑:
    class BlogPostCategoryView(APIView):
        serializer_class = BlogPostSerializer
        permission_classes = (permissions.AllowAny, )
        # 新增这一行即可
        queryset = BlogPost.objects.all()
    
        # 其余代码保持不变
        def post(self, request, format=None):
            data = self.request.data
            category = data['category']
            queryset = BlogPost.objects.order_by('-date_created').filter(category__iexact=category)
            serializer = BlogPostSerializer(queryset, many=True)
            return Response(serializer.data)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 23:06:05