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

Django DRF报错"'Request' object has no attribute 'learner'"且序列化器分支失效怎么解决

问题修复方案

错误原因

  • 直接访问request.learner时,若请求对象未提前注入该属性(比如匿名请求未加learner属性、登录态失效时未置空该属性),会直接抛出'Request' object has no attribute 'learner'异常,无法进入后续判断分支。
  • 原有判断逻辑未覆盖属性不存在的场景,当属性不存在时会直接走到异常捕获逻辑,永远不会触发CDetailsSerializer的分支,这也是代码始终走else分支的核心原因。

修复方案

先通过getattr()方法安全获取learner属性,属性不存在时默认返回None,既解决属性不存在的报错问题,也能覆盖属性不存在等价于learner为空的业务场景。
修改后的代码如下:

def list(self, request, **kwargs):
    try:
        queryset = self.get_queryset()
        queryset = self.filter_queryset(queryset)
        # 安全获取learner属性,不存在时默认返回None
        learner = getattr(request, 'learner', None)
        if not learner:
            serializer = CDetailsSerializer(queryset, many=True)
        else:
            serializer = CourseDetailsSerializer(queryset, many=True)
        print('s', serializer.data)
        response_data = {'course': serializer.data}
        return self.jp_response(s_code='HTTP_200_OK', data=response_data)
    except Exception as e:
        print(e)
        return self.jp_error_response('HTTP_500_INTERNAL_SERVER_ERROR', 'EXCEPTION', [str(e), ])

可选排查步骤

如果修改后仍未正确触发分支,可做如下排查:

  • 加日志打印learner的实际值:在获取learner后新增代码print('learner值:', learner, type(learner)),确认需要走if分支的场景下,learner是否确实为Python可判定的假值(None、空字符串、0、空序列等)。
  • 若learner为ORM关联对象,空关联也会生成代理对象的场景下,可调整判断逻辑为判断主键是否存在:if not (learner and hasattr(learner, 'id') and learner.id)即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 20:45:04