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

