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

