[Fixed]-Serialize multiple models and send all in one json response django rest framework


You’ll find things easier in Django REST Framework if you design your response format rationally.

It seems a bit vague at the moment, but I would suggest something like:

    "tweets": [
        {"tweet_attr_A": value_1, ...},  // first tweet
        {"tweet_attr_A": value_2, ...},  // second tweet
    "articles": [
        {"id": 1, ...},  // first article
        {"id": 2, ...},  // second article

We can express this with three serializers, like:

class TweetSerializer(serializers.ModelSerializer):
    class Meta:
        model = Tweet

class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article

class TimelineSerializer(serializers.Serializer):
    tweets = TweetSerializer(many=True)
    articles = ArticleSerializer(many=True)


Then, because we’re using more than one model, it’s easiest just to define your own custom viewset rather than trying to shoe-horn this into DRF’s magic ModelViewSet type.

First we need an object type to pass into our TimelineSerializer. It should have two attributes: tweets and articles

from collections import namedtuple

Timeline = namedtuple('Timeline', ('tweets', 'articles'))

Then we’ll define the custom viewset to fetch the tweets and articles, instantiate a Timeline object and return the TimelineSerializer data:

class TimelineViewSet(viewsets.ViewSet):
    A simple ViewSet for listing the Tweets and Articles in your Timeline.
    def list(self, request):
        timeline = Timeline(
        serializer = TimelineSerializer(timeline)
        return Response(serializer.data)


I had a same situation to serialize multiple models to fetch filtered output from each serialize model to use from one single api. I came across this module to achieve this result.

Leave a comment