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规则生效,直接避免权限类的校验要求
修改对应代码行:
可选同步修改post方法内的调用,消除参数未使用提示:# 把原来的permissions_classes改成permission_classes permission_classes = (permissions.AllowAny, )# 把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
相关产品推荐
相关产品推荐

