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

测试update_match_video函数时遇AttributeError:'NoneType'无get属性

解决AttributeError: 'NoneType' object has no attribute 'get'问题

从你的报错和代码来看,核心问题是请求数据的结构和后端函数的预期不匹配,同时后端代码的参数判断也存在健壮性不足的问题。下面一步步拆解解决:

1. 问题根源:测试请求数据结构不符合后端预期

你的测试代码中发送的请求数据是:

match_updated_data = { 'id': 1, 'status': 'not_started', }

但后端update_match_video函数第一行就尝试获取request.data.get('match').get('id')——这说明后端期望请求数据是一个嵌套结构,顶层要有match键,里面才包含id和status。而你直接把字段放在了顶层,导致request.data.get('match')返回None,调用.get('id')时触发AttributeError。

2. 第一步:修正测试的请求数据结构

把测试中的请求数据改成后端期望的嵌套格式:

match_updated_data = {
    'match': {
        'id': 1,
        'status': 'not_started'
    }
}

另外注意:后端后续代码里还用到了valid_data_or_error(request.data, method='PUT')['match_data']['id'],这里的键是match_data而非match——如果valid_data_or_error是你自定义的校验函数,返回的是包含match_data的结构,那你可能需要统一请求数据的键名,比如把测试数据改成:

match_updated_data = {
    'match_data': {
        'id': 1,
        'status': 'not_started'
    }
}

同时修改后端开头的判断逻辑,和后续代码保持一致:

match_data = request.data.get('match_data')
if not match_data or not match_data.get('id'):
    return JsonResponse({}, status=status.HTTP_400_BAD_REQUEST)

3. 第二步:增强后端代码的健壮性

不管请求数据结构是否正确,都应该先判断嵌套对象是否存在,再调用.get()方法,避免None报错。比如把后端开头的逻辑改成:

def update_match_video(request):
    # 先获取外层嵌套对象,判断是否存在
    match_data = request.data.get('match')  # 或者'match_data',根据实际预期调整
    if not match_data or not match_data.get('id'):
        return JsonResponse({}, status=status.HTTP_400_BAD_REQUEST)
    
    print('request data get match id: ', match_data.get('id'))
    # 后续代码...

4. 额外注意:测试断言的合理性

你的测试断言是self.assertEqual(Match.objects.first().status,'live'),但看后端代码:

  • 如果数据库中match的当前状态是live,会强制把请求的status设为live
  • 如果当前状态是closed,会强制设为closed
    只有当当前状态既不是live也不是closed时,才会使用请求中的status值。所以要确保测试前Match.objects.first().status是not_started(或其他非live/closed状态),否则断言会失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:18:09