Django Rest Framework:在多部分/表单数据请求中序列化数组

Ric*_*ard 8 python django http multipartform-data django-rest-framework

我正在尝试使用 multipart/form-data 发送列表/数组。

定义ModelSerializer该字段使用

class RequestSerializer(serializers.ModelSerializer):
  # ...
  in_categories = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
Run Code Online (Sandbox Code Playgroud)

Model字段定义为

class Request(models.Model):
  # ....
  in_categories = models.ManyToManyField(to='Category',
                                         through='RequestToCategory',
                                           blank=False)
Run Code Online (Sandbox Code Playgroud)

现在,我的定义ModelViewSet 如下:

class RequestViewSet(viewsets.ModelViewSet):
   # ...
   def create(self, request, *args, **kwargs):
        print(request.data)
        serializer = self.get_serializer(data=request.data)
        print(serializer.is_valid(raise_exception=True))
        print(serializer.validated_data)
Run Code Online (Sandbox Code Playgroud)

但是,该in_categories字段永远不会填充实际数据,验证器raise在调用时也不会出现异常。

我没有找到任何方法以字段实际获取定义的键列表的方式传输数据。我尝试了三件事:

  1. 以文字形式发送数据会导致request.data = <QueryDict: { ... 'in_categories': ['[2, 3]'] ...
  2. 将数据作为数组发送,结果是request.data = <QueryDict: { ... 'in_categories[0]': ['2'], in_categories[1]': ['3'] ...
  3. 使用额外的键将数据作为数组发送,结果是request.data = <QueryDict: { ... 'in_categories[0]id': ['2'], in_categories[1]id': ['3'] ...

每个解决方案 (i) 均达到ViewSet,(ii) 正确验证,但 (iii) 未反映 serializer.validated_data

我错过了什么吗?我已经花了几个小时在这上面,没有找到如何让 DRF 理解我想要的解决方案。

Aja*_*sia -2

为我

Request = json.loads(json.dumps(request.data))
Run Code Online (Sandbox Code Playgroud)

已解决问题

  • 通过额外的支持信息可以改进您的答案。请[编辑]添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以[在帮助中心](/help/how-to-answer)找到有关如何写出好的答案的更多信息。 (3认同)