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

使用objects.filter()时Django REST框架GET返回全Null、DELETE报错求助

Django REST Framework 多对象接口异常问题解决

问题1:getOneSet接口返回全Null

原因:ProA.objects.filter(var1=var1) 返回的是QuerySet(多对象集合),但序列化时指定了 many=False,序列化器会按单个对象规则处理集合,导致字段无法正确映射,最终返回全Null。

修正代码:

@api_view(['GET'])
def getOneSet(request, var1):
    proa = ProA.objects.filter(var1=var1)
    serializer = ProASerializer(proa, many=True)  # 改为many=True,适配多对象集合
    return Response(serializer.data)

问题2:deleteOneSet接口提示"Method GET not allowed"及删除逻辑异常

原因及修正步骤:

  1. 请求方法错误:确认调用接口时使用DELETE请求方法,浏览器直接访问默认是GET请求,会触发该错误,建议用Postman、curl等工具发送DELETE请求。
  2. 异常捕获无效:filter()返回空QuerySet时不会抛出DoesNotExist异常,原try-except块无法检测无匹配数据的情况,需手动判断集合是否为空:
  3. URL路径转义问题:原urls中&lt;str:var1&gt;是HTML转义字符,Django无法解析,需改为<str:var1>。

修正后的完整代码:

urls.py

urlpatterns = [
    path('proa-getAll/', views.getAll, name='proa_getAll'),
    path('proa-getOne/<str:var1>', views.getOneSet, name='proa_getOne'),
    path('proa-delete/<str:var1>', views.deleteOneSet, name='proa_delete'),
]

views.py

@api_view(['DELETE'])
def deleteOneSet(request, var1):
    data = ProA.objects.filter(var1=var1)
    if not data.exists():  # 手动检查是否有匹配数据
        return Response({'message': 'The var1 value does not exist'}, status=status.HTTP_404_NOT_FOUND)
    
    data.delete()
    # 注意:HTTP 204 No Content状态码下响应内容会被忽略,改用200 OK确保消息能被接收
    return Response({'message': 'Data was deleted successfully!'}, status=status.HTTP_200_OK)

额外优化建议

getAll接口可复用已定义的变量,避免重复查询数据库:

@api_view(['GET'])
def getAll(request):
    proas = ProA.objects.all()
    serializer = ProASerializer(proas, many=True)
    return Response(serializer.data)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 14:59:53