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

为什么为Django REST Framework的ViewSet添加__init__方法会报错?

报错原因

你重写的InstrumentViewSet的__init__方法没有兼容父类初始化时需要接收的关键字参数。
DRF的路由在实例化ViewSet的时候,会自动传入suffix、basename、detail等多个关键字参数,父类viewsets.ViewSet原生的__init__方法默认支持接收这些参数。但你自定义的__init__方法定义为def __init__(self):,没有预留接收额外参数的位置,实例化时传入的suffix参数无处接收,就会抛出unexpected keyword argument 'suffix'的错误。

修复方法

重写__init__方法时,增加可变位置参数和关键字参数的接收逻辑,再传递给父类的初始化方法即可,修改后的代码如下:

class InstrumentViewSet(viewsets.ViewSet):
    def __init__(self, *args, **kwargs):
        # 你的自定义初始化逻辑写在这里即可
        # self.instrument_service = InstrumentsService()
        # self.instruments = Instrument.objects.all()
        super().__init__(*args, **kwargs)

    # 其余保留原有的list等方法逻辑
  • *args用于接收所有未命名的位置参数,**kwargs用于接收所有关键字参数,包括DRF自动传入的suffix等参数,传递给父类后即可正常运行。
额外提示

不建议在ViewSet的__init__方法中执行数据库查询操作(比如你注释掉的Instrument.objects.all()),这类查询逻辑放到对应请求方法(比如list、retrieve等)中执行更合理,能避免不必要的数据库连接泄露、缓存脏数据等问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:45:03