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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:54:03