【问题标题】:How to return a 404 when drf returns empty queryset using ListAPIView当drf使用ListAPIView返回空查询集时如何返回404
【发布时间】:2018-04-09 17:49:50
【问题描述】:
class listapiview(ListAPIView):

    queryset = testobj.objects.all()
    serializer_class = testobjSerializer
    def get_queryset(self):
        queryset = testobj.objects.all()
        build_id = self.request.query_params.get('id', None)
        if id is not None:
            queryset = queryset.filter(id=id)
        return queryset

我只是将一些视图从 APIView 重写为 ListAPIView,它破坏了我的一些单元测试,因为空查询集仍然返回 200。我想找出返回 404 的最佳方法(或任何适当的错误代码)在这个)使用我的例子。

我尝试添加:

if queryset:
    return queryset
else:
    return Response(status=status.HTTP_404_NOT_FOUND)

但收到分页器错误:

TypeError: object of type 'Response' has no len()

【问题讨论】:

  • 为什么要在列表视图中显示 404?
  • 我不确定我是否这样做,我想要完成的只是在查询集为空时不返回 200 成功...
  • 嗯,get_queryset 函数需要 queryset 而不是 Response。如果您想合并此内容,可以像其中一个答案所建议的那样提出异常。

标签: django django-rest-framework


【解决方案1】:

引发异常而不是返回Response

django rest 框架在其exception 模块中有多个预定义的异常,例如NotFound 异常。您可以通过从异常中导入来添加它

from rest_framework.exceptions import NotFound 

并通过以下代码修改您的get_queryset 逻辑

if queryset:
    return queryset
else:
    raise NotFound()

【讨论】:

    【解决方案2】:

    你可以使用

    return HttpResponseNotFound('<h1>Page not found</h1>')

    抱歉格式化,在移动设备上

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-25
      • 2022-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      相关资源
      最近更新 更多