【问题标题】:AssertionError: Expected a `Response`, `HttpResponse` or `HttpStreamingResponse` to be returned from the view, but received a `<class 'NoneType'>`AssertionError:期望从视图返回一个`Response`、`HttpResponse`或`HttpStreamingResponse`,但收到了`<class 'NoneType'>`
【发布时间】:2018-11-18 15:45:59
【问题描述】:

我有以下以用户为成员的房间对象。

class Room(Base):
    name = models.CharField(db_index=True, unique=True, max_length=255)
    members = models.ManyToManyField(User, blank=True)

我正在尝试查找只有两个特定成员的房间,

if Room.objects.filter(members__id=first.id).filter(members__id=second.id).exists():
                    rooms = Room.objects.filter(members__id=first.id).filter(members__id=second.id)
                    for room in rooms:
                        print(room.members.count)
                        if room.members.count == 2:
                            return Response({"Success": RoomSerializer(room).data}, status=status.HTTP_200_OK)

我知道存在一个只有两个成员的 Room 对象。但我最终得到了这个错误,

AssertionError: Expected a `Response`, `HttpResponse` or `HttpStreamingResponse` to be returned from the view, but received a `<class 'NoneType'>`

任何帮助表示赞赏。

【问题讨论】:

  • room.members.count 应该是 room.members.count()
  • @Borut 你可以把这个作为答案,这对我有用。

标签: python django django-models django-orm


【解决方案1】:

QuerySet count() 是一个方法(type(room.members.count) 返回&lt;class 'method'&gt;),应该这样调用。换个方式

room.members.count

room.members.count()

它应该按预期工作。

【讨论】:

    【解决方案2】:

    正如异常所说,在视图结束时,总是返回一个响应。在您当前的代码中,如果逻辑不匹配,则返回 None。所以,更新代码如下:

    if Room.objects.filter(members__id=first.id).filter(members__id=second.id).exists():
                    rooms = Room.objects.filter(members__id=first.id).filter(members__id=second.id)
                    for room in rooms:
                        print(room.members.count)
                        if room.members.count == 2:
                            return Response({"Success": RoomSerializer(room).data}, status=status.HTTP_200_OK)
    return Response({"Failed": True}, status=status.HTTP_400_BAD_REQUEST) # <-- Return a bad request maybe at the end if all logic fails
    

    【讨论】:

    • 这是不正确的。如果代码已经进入 if 块,那么我已经确定我有一个有效的响应。正确答案在 cmets 中。
    • 因为你展示了部分代码并且只有在if条件下才返回响应,可以假设可能存在不符合条件的逻辑,在这种情况下,代码没有有任何返回响应。这是我关注的部分。我没有看到count,borut 很好:)
    猜你喜欢
    • 1970-01-01
    • 2019-05-31
    • 2020-10-04
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 2019-12-02
    相关资源
    最近更新 更多