重写perform_update时,为何用super().perform_update(serializer)而非serializer.save()?
为什么重写perform_update时用
super().perform_update(serializer)而非直接调用serializer.save()? 核心结论:super().perform_update(serializer)本质上会调用serializer.save(),但它能完整继承DRF框架或父类视图中perform_update方法的所有内置/自定义逻辑;直接调用serializer.save()只会执行序列化器的保存操作,会跳过这些额外逻辑。
具体区别可以拆成这几点:
- 继承框架默认行为:DRF基类(比如
ModelViewSet的父类)里的perform_update,除了调用serializer.save(),还会和视图的整个流程联动(比如后续的响应处理、内置信号触发等)。直接调用serializer.save()等于绕过了这些框架层面的标准流程,可能导致某些隐含功能失效。 - 兼容父类自定义逻辑:如果你的视图继承了自定义父视图,而父视图的
perform_update里有额外操作(比如记录更新日志、同步关联数据、触发自定义业务信号),用super()就能自动复用这些逻辑;直接调用serializer.save()会完全跳过这些自定义操作,破坏代码的继承性。 - 保持代码扩展性:未来DRF框架更新时,
perform_update的内部逻辑可能新增功能(比如安全校验升级、性能优化),用super()的话,你的代码不需要修改就能同步享受到这些更新;而直接写serializer.save(),就无法跟进框架的这些变化。
回到你给出的代码示例:
def perform_update(self, serializer): if serializer.instance.author != self.request.user: raise PermissionDenied('Сhange other people\'s content forbidden') super(PostViewSet, self).perform_update(serializer) #serializer.save()
这里先做了自定义权限校验,再通过super()调用父类方法,既保证了权限逻辑生效,又不会丢掉框架或父类的默认保存流程,是DRF视图扩展的标准写法。
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

