Django测试中self.client.patch请求返回404错误排查求助
Django REST Framework CustomerViewSet PATCH请求404问题排查与解决
以下是针对该问题的常见原因及对应解决方法:
重写的
get_object或get_queryset方法存在逻辑错误
检查CustomerViewSet中是否重写了这两个方法:- 如果
get_queryset添加了额外过滤条件(比如仅返回当前用户关联的客户),要确认测试用例中创建的Customer实例确实属于发起请求的用户,否则查询集为空会导致404。 - 如果重写了
get_object,要确保逻辑正确,比如是否错误使用了非主键字段作为查询条件,或者过滤时排除了目标实例。
- 如果
权限类导致资源隐藏
部分权限类(如自定义的IsOwner权限)会在用户无访问权限时返回404而非403,以此隐藏资源存在性。检查视图集的permission_classes,确认测试用例中的用户拥有目标Customer实例的修改权限。reverse生成URL时参数不匹配
确认reverse('customer-detail')传入的参数是否正确:- 如果视图集默认使用
pk作为lookup字段,要确保传入的是目标Customer实例的pk值,而非其他字段(如id以外的自定义字段)。 - 可以打印生成的URL(比如
print(reverse('customer-detail', args=[customer.pk]))),对比数据库中实例的主键,确认参数无误。
- 如果视图集默认使用
视图集的
lookup_field配置异常
如果CustomerViewSet修改了lookup_field(比如设置为slug),那么reverse生成URL时必须传入对应的slug参数,而非默认的pk。示例代码:reverse('customer-detail', kwargs={'slug': customer.slug})若参数不匹配,会导致URL格式正确但无法找到对应实例,返回404。
测试用例中实例创建逻辑问题
检查setup方法中创建Customer实例的代码,确认实例确实被成功保存到数据库,且主键值正确传递到测试方法中。比如是否在setup中创建实例后未刷新,或者实例的pk未被正确赋值。
内容的提问来源于stack exchange,提问作者Thomas Campos
相关产品推荐
相关产品推荐

