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

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后缀、路由解析出来的其他关键字参数),就算修好导入问题也可能在其他场景触发参数不匹配报错,建议一起修改。

修复方法
  1. 把视图文件里错误的Response导入删掉,换成正确的导入语句:
from rest_framework.response import Response
  1. 修正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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:51:23