Django REST Framework报get_extra_actions()缺失self参数错误如何解决
报错原因
- 你的视图继承的是
APIView类,但路由配置中使用了DRF的Router(如DefaultRouter)注册该视图。Router仅适配ViewSet系列视图,注册时会主动调用get_extra_actions方法,APIView本身没有该方法的默认实现,你自定义的方法在类层面被调用时就会触发缺少self参数的错误。 - 自定义的
get_extra_actions存在逻辑错误:你返回的是[self.get()],这是直接执行get方法而非返回方法引用,且get方法必须传入request参数才能正常运行,本身也不符合extra_actions的参数要求。 - 额外问题:
serial_class = PublicationSerializer()直接实例化了序列化器,正确写法是仅赋值类本身,不需要加括号。
解决方案
提供两种可选方案,根据你的路由使用习惯选择即可:
方案一:保留APIView继承
- 删除视图中自定义的
get_extra_actions方法,APIView不需要该方法 - 放弃使用Router注册视图,改用普通Django路由配置,示例:
# 你的app的urls.py文件 from django.urls import path from .views import PublicationView urlpatterns = [ path('publications/', PublicationView.as_view(), name='publication-list'), ]
- 修正序列化器赋值写法为
serial_class = PublicationSerializer
方案二:改用ViewSet适配Router注册
如果你需要使用Router的自动路由生成能力,直接修改视图继承类即可:
from rest_framework import viewsets from .models import Publication from rest_framework.response import Response from .serializer import PublicationSerializer class PublicationView(viewsets.ViewSet): # 仅赋值序列化器类,不实例化 serial_class = PublicationSerializer # ViewSet列表查询对应list方法,不需要自定义get方法 def list(self, request): detail = [ {'pub_id': i.pub_id, 'pub_date': i.pub_date, 'title': i.title, 'description': i.description, 'link': i.link} for i in Publication.objects.all() ] return Response(detail)
- 原有Router注册逻辑无需修改,ViewSet已经默认实现了
get_extra_actions方法,不需要自定义。
内容的提问来源于stack exchange,提问作者Adam Kalinowski
相关产品推荐
相关产品推荐

