为什么为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
相关产品推荐
相关产品推荐

