使用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"及删除逻辑异常
原因及修正步骤:
- 请求方法错误:确认调用接口时使用
DELETE请求方法,浏览器直接访问默认是GET请求,会触发该错误,建议用Postman、curl等工具发送DELETE请求。 - 异常捕获无效:
filter()返回空QuerySet时不会抛出DoesNotExist异常,原try-except块无法检测无匹配数据的情况,需手动判断集合是否为空: - URL路径转义问题:原urls中
<str:var1>是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
相关产品推荐
相关产品推荐

