如何在DRF中处理空索引列表?

时间:2016-03-10 00:47:53

标签: django django-rest-framework

我在使索引视图工作时遇到了一些问题。当数据库查询返回一个对象列表时,一切都很好。但是当查询变空时 - 因为还没有记录 - 响应并不是我所期望的:

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,因此我不太确定这是不是应该如何运作。

我已经梳理了文档,我发现的是如何处理 一个 不存在的资源 - 使用{{ 1}}。那么如何处理不存在的 多个 资源列表?

请告知。

1 个答案:

答案 0 :(得分:2)

您正在使用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()。

此外,如果序列化程序有多个对象作为其响应,它应该有多个= 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)