drf中serializer通过self.context['request']获取request对象的原因
在视图类中可通过self.request来获取request对象,是因为源码中的dispatch将其封装到类中
1 2 3 4 5 6 7 8 9 10 | def dispatch( self , request, * args, * * kwargs): """ `.dispatch()` is pretty much the same as Django's regular dispatch, but with extra hooks for startup, finalize, and exception handling. """ self .args = args self .kwargs = kwargs request = self .initialize_request(request, * args, * * kwargs) self .request = request self .headers = self .default_response_headers # deprecate? |
在获取serializer类时,源码中的get_serializer_context将其封装到类中
1 2 3 4 5 6 7 8 | def get_serializer( self , * args, * * kwargs): """ Return the serializer instance that should be used for validating and deserializing input, and for serializing output. """ serializer_class = self .get_serializer_class() kwargs.setdefault( 'context' , self .get_serializer_context()) return serializer_class( * args, * * kwargs) |
所以,在serializer中进行校验时,可以通过self.context['request']来获取到request对象
1 2 3 4 5 6 7 8 9 | ........ <br> <br> def validate_topic( self ,value): if not value: # 没有话题,也可以通过 return value request = self .context( 'request' ) exists = models.Topic.objects. filter (deleted = False , id = value. id ,user = request.user).exists() if not exists: raise ValidationError( '话题不存在' ) return value |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)