django - 当 drf 使用 ListAPIView 返回空查询集时如何返回 404

标签 django django-rest-framework

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

我刚刚将一些 View 从 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()

最佳答案

引发异常而不是返回响应

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

from rest_framework.exceptions import NotFound 

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

if queryset:
    return queryset
else:
    raise NotFound()

关于django - 当 drf 使用 ListAPIView 返回空查询集时如何返回 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49738795/

相关文章:

python - 使用 Django 表单编辑图像字段

python - Django 管理员 "Edit Selection"操作?

Django - 如何获取字段的 max_length

当搜索字段为空时,Django SearchFilter 显示所有数据

django - 如何验证在序列化/反序列化期间至少存在两个字段之一

python - Django MEDIA_URL 和 MEDIA_ROOT

mysql - 如何让 Django 使用不受支持的 MySQL 驱动程序,例如 gevent-mysql 或 Concurrence 的 MySQL 驱动程序?

Django - 将 Django Rest Swagger 架构添加到带有 `@api_view` 的 DRF 标记函数

django - 将 Django 模型选择字段与 React js 选择选项连接的最佳方式是什么

django - 如何开始使用 django South 数据库迁移?