Mike_Wazowski
Mike_Wazowski

Reputation: 81

How to make Custom Serializer from different models?

I have 3 different models. I need to build a custom serializer with these 3 models. I tried using some code, but it didn't reach what I expected. There is structure, but I was not able to get the data I was expecting

# Serializer This my Serializer and ModelOne, ModelTwo, ModelThree these are my models.

class ModelOneSerializer(serializers.ModelSerializer):
    class Meta:
        model = ModelOne
        fields = ['id', 'obj_1', 'obj_2']


class ModelTwoSerializer(serializers.ModelSerializer):
    class Meta:
        model = ModelTwo
        fields = ['id', 'obj_1', 'obj_2']


class ModelThreeSerializer(WritableNestedModelSerializer):
    class Meta:
        model = ModelThree
        fields = ['id', 'obj_1', 'obj_2']



class CustomSerializer(serializers.Serializer):
    model_1 = ModelOneSerializer(many=True)
    model_2 = ModelTwoSerializer(many=True)
    model_3 = ModelThreeSerializer(many=True)

# View


class CustomView(APIView):
    def get(self, request, *args, **kwargs):
        serializer = CustomSerializer(context={'request': request})
        return Response({'response': 'ok', 'result': serializer.data})

# Expected Output


    {
    "response": "ok",
    "result": {
        "model_1": [
        {
        "id":"1",
        "obj_1":"test",
        "obj_2":"test",
        "obj_3":"test"
        },
        {
        "id":"1",
        "obj_1":"test",
        "obj_2":"test",
        "obj_3":"test"
        }
        ],
        "model_2": [
        {
        "id":"1",
        "obj_1":"test",
        "obj_2":"test",
        "obj_3":"test"
        }
        ],
        "model_3": [
        {
        "id":"1",
        "obj_1":"test",
        "obj_2":"test",
        "obj_3":"test"
        }
        ]
    }
}

The results may have multiple data in the model_2 and model_3 as in the model_1 structure

Upvotes: 1

Views: 158

Answers (1)

heemayl
heemayl

Reputation: 41987

You didn't pass what to serialize for all the model serializers, so CustomSerializer doesn't have anything to serialize against.

You can pass the querysets of the models to CustomSerializer:

class CustomView(APIView):
    def get(self, request, *args, **kwargs):   
        model_one_qset = ModelOne.objects.all()
        model_two_qset = ModelTwo.objects.all()
        model_three_qset = ModelThree.objects.all()

        qsets_map = {
            'model_1': model_one_qset,
            'model_2': model_two_qset,
            'model_3': model_three_qset,
        }

        serializer = CustomSerializer(qsets_map, context={'request': request})

        return Response({'response': 'ok', 'result': serializer.data})

Upvotes: 1

Related Questions