Django Rest Framework调用时Postman未正常返回400错误如何修复
问题根因
你当前的异常捕获逻辑不生效,核心原因是 Django ORM的filter()方法永远不会抛出DoesNotExist异常:
filter()无论是否匹配到数据,都会返回一个QuerySet对象,无匹配数据时仅返回空QuerySet,不会触发异常- 只有
get()方法在查询不到匹配数据时,才会抛出DoesNotExist异常
修复方案
因为你查询的是主键pk,本身具备唯一性,推荐改用get()方法适配你的异常捕获逻辑,修改后的代码如下:
@api_view(['GET']) def selected_device(request,pk=None): if pk != None: try: # 改用get查询单条数据,查询不到自动抛DoesNotExist device = Device.objects.get(pk=pk) except Device.DoesNotExist: return Response(status=status.HTTP_400_BAD_REQUEST) try: devicedetail = DeviceDetail.objects.get(DD2DKEY=pk) except DeviceDetail.DoesNotExist: return Response(status=status.HTTP_400_BAD_REQUEST) # 单条数据不需要many=True参数 devserializer = DeviceSerializers(device) devdserializer = DeviceDetailSerializers(devicedetail) results = { "device": devserializer.data, "device_details": devdserializer.data } return Response(results)
如果你坚持要使用filter()做查询,可以通过exists()方法主动判断是否有匹配数据,不需要依赖异常捕获:
@api_view(['GET']) def selected_device(request,pk=None): if pk != None: devices = Device.objects.filter(pk=pk) devicedetail = DeviceDetail.objects.filter(DD2DKEY=pk) # 主动判断是否存在匹配数据 if not devices.exists() or not devicedetail.exists(): return Response(status=status.HTTP_400_BAD_REQUEST) devserializer = DeviceSerializers(devices, many=True) devdserializer = DeviceDetailSerializers(devicedetail, many=True) results = { "device": devserializer.data, "device_details": devdserializer.data } return Response(results)
额外优化提示:查询不存在的资源更符合HTTP规范的状态码是
404 NOT FOUND,你可以根据业务场景调整替换当前的400状态码。
内容的提问来源于stack exchange,提问作者L.Calvin
相关产品推荐
相关产品推荐

