如何处理 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 中的空值/空值

如何处理 ASP.NET SqlDataSource 中的空 CONTAINS() 查询参数?

如何处理参数化查询中的空用户输入?

如何处理来自存储在vue中的空数据

如何处理泛型函数中的空 Guid?

Pyspark:如何处理 python 用户定义函数中的空值