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

Django单元测试:向get_queryset传参出现KeyError如何解决?

问题:Django视图get_queryset获取参数时出现KeyError

我修改了视图的get_queryset()方法,代码如下:

def get_queryset(self):
    type_of_review = self.request.data['type_of_review']
    queryset = Reviews.objects.filter(type_of_review=type_of_review).order_by('-id')[:3]
    return queryset

该方法意图根据type_of_review字段筛选Reviews模型数据,按id倒序返回最新3条。

编写单元测试时,我用以下代码传递筛选参数:

def test_list_three_review(self):
    self.data = [ReviewsFactory.create() for i in range(10)]
    response = self.client.get(self.url2, {"type_of_review": "Team"})
    self.assertEqual(response.status_code, status.HTTP_200_OK)

但运行测试时报错:test_list_three_review - KeyError: 'type_of_review',请问问题出在哪?


错误原因

GET请求的查询参数不会存储在request.data中,request.data主要用于处理POST、PUT等请求的请求体数据(如JSON、表单提交的数据)。而GET请求的参数需要通过request.GET对象来获取,直接从request.data中取值会因找不到对应键而抛出KeyError。

解决方法

1. 修改视图的get_queryset方法

将参数获取方式改为从request.GET中读取,同时建议使用get()方法避免参数缺失时直接抛出异常,还可设置默认值:

def get_queryset(self):
    type_of_review = self.request.GET.get('type_of_review')
    # 处理参数不存在的情况,可根据业务需求调整返回逻辑
    if not type_of_review:
        return Reviews.objects.none()
    queryset = Reviews.objects.filter(type_of_review=type_of_review).order_by('-id')[:3]
    return queryset

2. 优化测试数据创建

测试时需确保存在type_of_review="Team"的记录,否则筛选结果为空,后续若要断言返回数据数量会失败。可调整工厂创建代码:

# 创建5条Team类型评论和5条其他类型评论
self.data = [ReviewsFactory.create(type_of_review="Team") for _ in range(5)] + [ReviewsFactory.create() for _ in range(5)]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 13:03:25