如何处理 DRF 中的空索引列表?
Posted
技术标签:
【中文标题】如何处理 DRF 中的空索引列表?【英文标题】:How to handle an empty index list in DRF? 【发布时间】:2016-06-24 15:41:01 【问题描述】:我在让索引视图正常工作时遇到了一些问题。当数据库查询返回一个对象列表时,一切都很好。但是当查询为空时——因为还没有记录——响应并不是我所期望的:
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)
。那么如何处理不存在的多个资源列表?
请指教。
【问题讨论】:
In Django, how do I objects.get, but return None when nothing is found?的可能重复 @rnevius 即使我返回 None,我如何让 API 响应我在上下文对象中提供的自定义消息? @Duos 我的回答对你有帮助吗?如果是,请接受。 @ilse2005 这没有帮助,但我赞成你的回答,因为它给了我一个全新的视角。 【参考方案1】:您正在使用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)
【讨论】:
好吧,try
块是我应该包括的。但是,您的代码都不起作用。我已经尝试过了,但同样的错误 404 错误。我已经尝试过objects.get()
和objects.filter()
。仍然没有运气。
我刚刚意识到这段代码只适用于获取一个对象,并且在 Django 中最常用于详细视图。这里的上下文是一个索引视图,try
块不适用,因为它只会返回一条记录。通常,索引视图使用objects.all()
、objects.get()
或objects.filter()
。
是的。我试图在我的回答中告诉你
好的。我尝试了不同的代码排列,我得出的结论是你的方法是这样做的。所以基本上不管是一个不存在的对象,还是多个不存在的对象,Django都会抛出同样的DoesNotExist
错误?
@Duos,您的编辑无效。如果没有找到记录,filter
不会抛出异常。它只会返回一个空列表。以上是关于如何处理 DRF 中的空索引列表?的主要内容,如果未能解决你的问题,请参考以下文章
如何处理 JsonConvert.DeserializeObject 中的空值/空值