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

Django 如何处理DRF中的空索引列表?,django,django-rest-framework,Django,Django Rest Framework,我在使用索引视图时遇到一些问题。当数据库查询返回对象列表时,一切正常。但当查询为空时(因为还没有记录),响应与我期望的不太一样: if request.method == 'GET': powers = Power.objects.get(hero=hero_id); if powers: serializer = PowerSerializer(powers) return Response(serializer.data) cont

我在使用索引视图时遇到一些问题。当数据库查询返回对象列表时,一切正常。但当查询为空时(因为还没有记录),响应与我期望的不太一样:

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)
当英雄拥有超能力时,上面的代码可以完美地工作。但是当英雄没有超能力时,我希望看到自定义消息,但是我得到的是
http404notfound
。我尝试更改为
status=status.HTTP\u 204\u NO\u CONTENT
,但没有区别-相同的
404
弹出。因为我以前从未开发过API,所以我不太确定事情是否应该这样做

我对文档进行了梳理,发现的只是如何处理一个不存在的资源——使用
返回响应(status=status.HTTP\u 404\u NOT\u found)
。那么,如何处理一个不存在的多个资源的列表呢


请告知。

您正在使用
对象。获取
。如果对象不存在,这将抛出
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\u 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)

@rnevius的可能重复即使我不返回,我如何让API响应我在上下文对象中提供的自定义消息?@Duos我的回答对您有帮助吗?如果是这样,请接受它。@ilse2005它没有帮助,但我对你的答案投了更高的票,因为它给了我一个新的视角。嗯,
try
块是我应该包含的。然而,您的代码都不起作用。我试过了,但同样的错误是404错误。我尝试了
objects.get()
objects.filter()
。还是不走运。我刚刚意识到,这段代码只适用于获取一个对象,在Django中,最常用于细节视图。这里的上下文是索引视图,
try
块不适用,因为它只返回一条记录。通常,索引视图使用
对象.all()
对象.get()
,或
对象.filter()
。是。我想在我的回答中告诉你,好的。我尝试过不同的代码排列,我得出结论,你的是这样做的方式。因此,基本上,无论是一个不存在的对象,还是许多不存在的对象,Django都会抛出相同的
DoesNotExist
error?@Duos,您的编辑将无法工作<如果未找到任何记录,则代码>筛选器
不会引发异常。它只会返回一个空列表。