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

重写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 22:15:02