django - 如何处理DRF中的空索引列表?

标签 django django-rest-framework

我在使用索引 View 时遇到一些问题。当数据库查询返回对象列表时,一切都很好。但是,当查询为空时(因为还没有记录),响应并不完全符合我的预期:

if request.method == 'GET':
    powers = Power.objects.get(hero=hero_id);

    if powers:
        serializer = PowerSerializer(powers)
        return Response(serializer.data)

    context = {"message": "This hero has no powers... yet!"}
    return Response(context, status=status.HTTP_200_OK)

当英雄拥有超能力时,上述代码可以完美运行。但是,当英雄没有能力时,我希望看到自定义消息,但我却收到 HTTP 404 Not Found。我尝试更改为 status=status.HTTP_204_NO_CONTENT,但是没有区别 - 弹出相同的 404。由于我以前从未开发过 API,因此我不太确定事情是否应该这样工作。

我梳理了文档,发现的只是如何处理一个不存在的资源 - 使用 return Response(status= status.HTTP_404_NOT_FOUND)。那么我该如何处理不存在的多个资源列表呢?

请指教。

最佳答案

您正在使用objects.get。如果对象不存在,这将引发 DoesNotExist 错误。您必须捕获此错误:

if request.method == 'GET':
    try:
        powers = Power.objects.get(hero=hero_id);

        serializer = PowerSerializer(powers)
        return Response(serializer.data)
    except Power.DoesNotExist:
        context = {"message": "This hero has no powers... yet!"}
        return Response(context, status=status.HTTP_200_OK)

但如果我理解正确的话,英雄可以拥有多种力量,对吗? 因此,您可能希望将查询更改为 Power.objects.filter(hero=hero_id) 以获取英雄的所有权力。那么你的代码应该可以工作。

编辑:

这就是 Duos 最终解决问题的方法:

您正在使用objects.get(),它仅适用于您只查询一个对象的情况。看来您想要返回对象的集合 - 英雄有很多力量 - 所以您应该使用objects.filter()。

此外,如果序列化程序有多个对象作为其响应,则它应该有 Many=True,否则会抛出错误。

上下文消息不是必需的,如果没有权限,只需将空列表返回给客户端进行相应处理即可:

if request.method == 'GET':
    powers = Power.objects.filter(hero=hero_id)
    if powers:
        serializer = PowerSerializer(powers, many=True)
        return Response(serializer.data)
    return Response(powers, status=status.HTTP_200_OK)

关于django - 如何处理DRF中的空索引列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35905579/

相关文章:

Django 或 Django Rest Framework 在测试时无法解析 url 参数

python - Django 为静态文件返回 404

python - 使用分页和原始查询集的 django 错误

python - Django 表单图像字段出现在 self.data 中但没有出现在 self.cleaned_data 中

Ajax 跨域错误

django - 如何构建 witt django-mptt 查询连接到 mptt 层次结构元素的任何后代?

python - 编程错误 : column "X" is of type double precision but expression is of type numeric[]

python - 如何在 django-rest-framework 中设置权限,以便 session 用户只能列出具有该用户外键的对象?

jquery - 将 jquery 与 django Rest api 一起放置

django - 如何在 Django Rest Framework 中设置双重嵌套序列化器