我在使索引视图工作时遇到了一些问题。当数据库查询返回一个对象列表时,一切都很好。但是当查询变空时 - 因为还没有记录 - 响应并不是我所期望的:
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}}。那么如何处理不存在的 多个 资源列表?
请告知。
答案 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)