Django REST框架:使用list_route

时间:2016-02-16 13:46:21

标签: python django django-rest-framework

我有一个带有额外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时默认提供这两者。

1 个答案:

答案 0 :(得分:1)

我认为您必须覆盖post方法(请参阅此处的问题https://api.instagram.com/v1/media/)并使用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)