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

DRF报错:'function'对象无'get_extra_actions'属性(React访问触发)

问题根源

你的核心错误是将用于函数视图的@api_view装饰器用在了类视图(ViewSet)上,这个装饰器会把你的HelloViewSet类转换成一个函数对象,而DRF的Router需要接收的是ViewSet类类型,因此触发了'function' object has no attribute 'get_extra_actions'错误。

解决方案

1. 移除错误的装饰器

直接删除HelloViewSet类上方的@api_view(['GET'])和@permission_classes([AllowAny])装饰器,因为DRF的viewsets.ModelViewSet本身继承自APIView,已经具备处理API请求的能力,不需要额外的函数视图装饰器。

2. 正确配置权限

关于你提到的401认证错误,通过类属性permission_classes直接配置即可,不需要依赖装饰器。你之前同时使用装饰器和类属性的方式会导致权限规则冲突,类属性会覆盖装饰器的设置。

修改后的views.py代码:

from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework.permissions import AllowAny, DjangoObjectPermissions

class HelloViewSet(viewsets.ModelViewSet):
    # dummy serializers and queryset for now
    serializer_class = SomeDummyDetailSerializer
    queryset = SomeDummyObject.objects.all()

    # 根据需求设置权限,这里改为AllowAny解决401问题
    permission_classes = [AllowAny]

    def list(self, request): # get list
        return Response({'message': 'Hello, worlds!'})
    
    def retrieve(self, request, pk=None): # get detail
        return Response({'message': 'Hello, worlds!'})
补充说明
  • @api_view仅适用于函数式视图,不能用于类视图,这是你触发错误的关键原因。
  • 如果后续需要恢复DjangoObjectPermissions权限,只需把permission_classes改回[DjangoObjectPermissions]即可,无需引入额外装饰器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 09:15:19