Django 当drf使用ListAPIView返回空queryset时,如何返回404

Django 当drf使用ListAPIView返回空queryset时,如何返回404,django,django-rest-framework,Django,Django Rest Framework,我刚刚将一些视图从APIView重写到ListAPIView,它破坏了我的一些单元测试,因为一个空的queryset仍然返回一个200。我想通过我的示例找出返回404(或任何适当的错误代码)的最佳方法 我试着加上: class listapiview(ListAPIView): queryset = testobj.objects.all() serializer_class = testobjSerializer def get_queryset(self):

我刚刚将一些视图从APIView重写到ListAPIView,它破坏了我的一些单元测试,因为一个空的queryset仍然返回一个200。我想通过我的示例找出返回404(或任何适当的错误代码)的最佳方法

我试着加上:

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
但收到一个分页器错误:

if queryset:
    return queryset
else:
    return Response(status=status.HTTP_404_NOT_FOUND)
你可以使用

返回HttpResponseNotFound('Page not found')


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

引发异常,而不是返回
响应

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

TypeError: object of type 'Response' has no len()
并通过以下代码修改您的
get\u queryset
逻辑

from rest_framework.exceptions import NotFound 

为什么要在列表视图上显示404?我不确定是否要执行tbh,我要做的只是在queryset为空时不返回200个成功值……好吧,
get\u queryset
函数期望的是
queryset
而不是
响应。如果你想合并这个,你可以提出一个例外,就像其中一个答案所建议的那样。
if queryset:
    return queryset
else:
    raise NotFound()