Django Rest Framework: Serialize an Array in a multipart/form-data request

Viewed 1191

I am trying to send a List / array using multipart/form-data.

The ModelSerializerdefines that field using

class RequestSerializer(serializers.ModelSerializer):
  # ...
  in_categories = serializers.PrimaryKeyRelatedField(many=True, read_only=True)

the Model field is defined as

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

now, I got a ModelViewSet defined as follows:

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)

However, the in_categories field never gets populated with actual data, nor does the validator raise an exception when called.

I did not find any way to transmit the data in a way the field actually gets a list of keys as defined. I tried three things:

  1. Sending the data as literal resulting in request.data = <QueryDict: { ... 'in_categories': ['[2, 3]'] ...
  2. Sending the data as array resulting in request.data = <QueryDict: { ... 'in_categories[0]': ['2'], in_categories[1]': ['3'] ...
  3. Sending the data as array with extra key resulting in request.data = <QueryDict: { ... 'in_categories[0]id': ['2'], in_categories[1]id': ['3'] ...

Each solution (i) arrives at the ViewSet, (ii) validates correctly but does (iii) not reflect into serializer.validated_data.

Do I miss something? I spent already hours on this, finding no solution on how to make DRF understand what I want.

1 Answers

For me

Request = json.loads(json.dumps(request.data))

has fixed the issue

Related