Django DRF ModelViewSet重写list方法触发__init__()参数错误
问题原因
报错是视图文件里Response导入错误导致的,和你重写list的逻辑本身没关系:
- DRF内置的list方法是框架
ListModelMixin提供的,源码内部已经提前导入了正确的rest_framework.response.Response类,所以不重写的时候接口正常 - 你自己写的list方法里调用的
Response,是当前视图文件里导入的错误类,这个类的构造方法只接收self参数,你传入serializer.data时就会触发__init__() takes 1 positional argument but 2 were given的报错。
另外你写的list方法参数签名不规范,没留可变参数接收路由传的额外参数(比如format后缀、路由解析出来的其他关键字参数),就算修好导入问题也可能在其他场景触发参数不匹配报错,建议一起修改。
修复方法
- 把视图文件里错误的Response导入删掉,换成正确的导入语句:
from rest_framework.response import Response
- 修正list方法的参数签名,补上
*args, **kwargs,修正后的完整视图代码:
from rest_framework import viewsets from rest_framework.response import Response from .models import Option from .serializers import OptionSerializer class OptionViewSet(viewsets.ModelViewSet): serializer_class = OptionSerializer queryset = Option.objects.all() def list(self, request, *args, **kwargs): queryset = Option.objects.all() serializer = OptionSerializer(queryset, many=True) return Response(serializer.data)
注意事项
- 检查下视图文件里有没有自己定义叫
Response的类、函数、变量,避免覆盖正确导入的Response - 如果后续需要加过滤、分页能力,直接复用DRF内置的
self.filter_queryset()、self.paginate_queryset()方法就行,和框架默认行为保持一致,减少出问题的概率。
内容的提问来源于stack exchange,提问作者SJ19
相关产品推荐
相关产品推荐

