我在使用索引 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/