【问题标题】:Django REST error returning a list of objectsDjango REST错误返回对象列表
【发布时间】:2015-06-07 21:36:45
【问题描述】:

我正在使用 Django REST 框架来为安卓游戏实现游戏服务器。我写了一个类,它派生自 GenericAPIView 来处理特定的 Http Post 请求。我希望请求返回一些对象的列表,这些对象以前从数据库中查询。

我的代码如下所示:

class NewGameView(GenericAPIView):
    serializer_class=NewGameRequestSerializer
    def post(self, request, format=None):
        serializer = NewGameRequestSerializer(data=request.DATA)
        if serializer.is_valid():
            req=serializer.save()

            mygamedata=...; # request game data objects

            serializer = MyGameDataSerializer(mygamedata, many=True)
            return Response(serializer.data,status=status.HTTP_201_CREATED)
        else:
            return Response(status=status.HTTP_400_BAD_REQUEST)

当我通过 curl 访问此视图时,一切正常。但是,当我使用 Django 生成的“browsable api”表单提交时,我收到了一个 'ListSerializer' object is not iterable “模板渲染”期间出错。如果我从 APIView 派生我的类,则不会发生错误,但 Django 将不再显示表单(无论出于何种原因)。

谁能解释发生了什么?

谢谢

【问题讨论】:

  • 您的代码中没有 ListSerializer 变量。你能提供更多的代码吗?
  • ListSerializer 类不是我写的。它是 Django REST 框架的一部分。我的MyGameDataSerializer 派生自serializers.ModelSerializer。我相信通过 many=True 会自动使它以某种方式使用这个 ListSerializer。我不确定确切的内部结构(我对 Django REST 还很陌生)。

标签: python django rest django-rest-framework


【解决方案1】:

您可以只返回包含所需数据的字典。

class NewGameView(GenericAPIView):
serializer_class=NewGameRequestSerializer
def post(self, request, format=None):
    serializer = NewGameRequestSerializer(data=request.DATA)
    if serializer.is_valid():
        req=serializer.save()

        mygamedata=...; # request game data objects

        data = {'game_name': mygame_object.name}
        return Response(data,status=status.HTTP_201_CREATED)

【讨论】:

  • 好吧,我没有使用ModelViewSet类,因为我的API接口并没有真正与数据库结构1:1对应。例如,我的 NewGameRequest 类不对应任何模型。不过,我确实按照您所说的进行了尝试,并且在将 url 模式更改为:url(r'^new_game/', views.NewGameView.as_view({'post': 'post'})) 之后,它显示的问题与以前完全相同。
  • @Dtag 所以你不想用帖子创建一个新的数据库条目?
  • 将您的网址更改为url(r'^new_game/',views.NewGameView.as_view())
  • 错误发生在这一行 serializer = MyGameDataSerializer(mygamedata, many=True),如果你删除 many=True 它应该可以解决问题,你也可以只返回一个包含所有数据的字典
  • 问题是可浏览的 api 无法呈现响应所以如果你返回 data={'name': 'GameData'} 作为响应你不会得到错误,我会更新我的回答告诉你我的意思
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-20
  • 2021-10-02
  • 2014-06-15
  • 1970-01-01
  • 1970-01-01
  • 2015-08-31
  • 2021-09-18
相关资源
最近更新 更多