Bjarki
Bjarki

Reputation: 231

Instantiating a Serializer consisting of multiple ModelSerializers - Django Rest Framework

I have two ModelSerializers:

class VariantSerializer(serializers.ModelSerializer):
    class Meta:
         model = Variant
         fields = (
             'id',
             'name',
             ... and so on)

and

class PictureItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = PictureItem
        fields = (
            'id',
            ... and so forth)

What I want to do is to return a JSON including a single instance of the VariantSerializer, and multiple instances of the PictureItemSerializer.

I created another serializer as such:

class PictureItemUploadSerializer(serializers.Serializer):
    variant = VariantSerializer()
    pictureItems = PictureItemSerializer(many=True)

But I'm having difficulties in instantiating this "combination" of a serializer if you will.

This does not work:

p = PictureItemUploadSerializer()
p.variant = variant_serializer
p.pictureItems = picture_item_serializer
return Response(p.data, status=status.HTTP_201_CREATED)

as it yields empty data:

{
    "variant": {
        "name": ""
    },
    "pictureItems": []
}

Upvotes: 1

Views: 865

Answers (1)

Rahul Gupta
Rahul Gupta

Reputation: 47876

You need to pass the data dictionary to the serializer when you are creating an instance of the serializer.

Lets say variant_data contains data for Variant model and picture_items_data contains the list of PictureItem model data.

Create a data dictionary containing them.

data = {'variant': variant_data, 'pictureItems': picture_items_data}

Then pass this data to the serializer.

p = PictureItemUploadSerializer(data=data) # pass the data dictionary
p.is_valid(raise_exception=True) # check if serializer is valid
return Response(p.data, status=status.HTTP_201_CREATED) # return response

Upvotes: 1

Related Questions