【问题标题】:Django REST Framework: accepting multiple POSTed objects with a list_routeDjango REST Framework:使用 list_route 接受多个 POSTed 对象
【发布时间】:2016-05-27 20:01:52
【问题描述】:

我有一个带有额外 list_route 的 ModelViewSet 来处理特定对象列表的 GET/POST:

class PickViewset(viewsets.ModelViewSet):

  queryset = Pick.objects.all()
  serializer_class = PickSerializer

  def get_queryset(self):
   #gets the correct queryset

  @list_route(methods=['get', 'post'])
  def update_picks(self, request, league, week, format = None):
    if request.method == 'POST':
      #process/save objects here
    else:
      #otherwise return the requested list

感谢我之前的question 的回答,此操作可以成功处理 GET 请求以及 POST - 但是,当我尝试 POST 多个对象时,我收到 JSON 错误:

"detail": "JSON parse error - Extra data: line 90 column 6 - line 181 column 2 (char 3683 - 7375)"

其中指定位置对应于第一个对象的末尾。如何更改 update_picks 来处理对象列表?另外,如果这个请求可能是新的和更新的现有对象的混合,我应该对所有对象都使用 POST,还是只在每个对象的基础上处理每个 POST/PUT?

我考虑将 CreateModelMixin 添加到 Viewset,但是它已经可以创建 - 但只能创建一个对象。 ListCreateAPIView 似乎很相似——它没有固有的列表创建,而只是 CreateModelMixin 和 ListModelMixin——我认为这两者都是在使用 ModelViewset 时默认提供的。

【问题讨论】:

  • 谢谢 - 我看过这些,因为它们看起来很相似,但是我相信这两个问题更多地涉及如何使用 DRF 序列化多个对象。在我的情况下,如果我发布超过 1 个对象,我什至无法进入提供的代码,因为 JSON 错误在它进入视图集之前返回。第一篇文章使用了 ListCreateAPIView,但我认为它包含的 mixin 已经包含在 ModelViewset 中——但也许我错了。

标签: python django django-rest-framework


【解决方案1】:

我认为您必须覆盖 post 方法(请参阅此处的问题 Django Rest Framework Batch Create)并使用 JSONParser().parse() 自行解析 json

def post(self, request, *args, **kwargs):
    if request.DATA['batch']:
        json = request.DATA['batchData']
        stream = StringIO(json)
        data = JSONParser().parse(stream)
        request._data = data
    return super(CharacterDatumList, self).post(request, *args, **kwargs)

【讨论】:

  • 但是,使用 ModelViewset,可以覆盖帖子吗? DRF 文档表明情况并非如此:ViewSet 类只是一种基于类的 View,它不提供任何方法处理程序,例如 .get() 或 .post(),而是提供.list() 和 .create() 等操作。 我认为该问题的发布者可能是因为他使用了 ListCreateAPIView
  • 我想你可以。但是你能发布完整的回溯来找出错误是在哪里引发的吗?
  • 嗯,错误只是在可浏览的 API 中显示为从 POST 2 个对象返回的 JSON - 这不是 Django/DRF 错误,带有错误的屏幕、完整的回溯和局部变量。这让我认为这是一种路由错误,但我知道它可能会命中 update_picks 操作的 POST 部分——它只是在存在超过 2 个对象的情况下无法到达那里。我现在不在家,稍后我可以提供截图。
  • 你能发布 JSON 对象吗?
  • 我会赞成答案,但我实际上并没有覆盖 POST 方法 - 代码按照我原来问题中的结构工作,我仍然不确定是否实际上覆盖了 Viewset 中的 POST作品。我认为如果我接受了一个我实际上并没有使用过的答案会产生误导——但我很感激你的帮助。
猜你喜欢
  • 2016-05-27
  • 1970-01-01
  • 1970-01-01
  • 2016-12-07
  • 2015-09-15
  • 2012-11-20
  • 2019-03-16
  • 2017-09-12
  • 1970-01-01
相关资源
最近更新 更多