shivam thakur
shivam thakur

Reputation: 119

want to output a list of dictionaries as a single dictionary in django rest api using modelserializer

from rest_framework import serializers
from .models import NewsFeed

class NewsFeedSerializer(serializers.ModelSerializer):
    """Serializer to map the Model instance into JSON format."""

    class Meta:
        """Meta class to map serializer's fields with the model fields."""
        model = NewsFeed
        fields = ('title', 'description', 'image', 'source_url','source_name','metadata','created_date')

returns This is what is returned While I want enter image description here

notice how a list of dictionaries are sent as one single dictionary under "feeds".

Upvotes: 0

Views: 2564

Answers (2)

ron_g
ron_g

Reputation: 1663

Unfortunately the accepted answer didn't work for me, so I thought I'd post how I solved this problem. I want to change a list of dictionaries to a single dictionary for ForeignKey related model instances.

Model.py

class DataSet(models.Model):
    # chart = models.OneToOneField(Chart, on_delete='CASCADE')
    title = models.CharField(max_length=20)

    def __str__(self):
        return '{}'.format(self.title)


class Entry(models.Model):
    data_set = models.ForeignKey(DataSet, on_delete='CASCADE')
    key = models.CharField(max_length=20)
    value = models.IntegerField()

    def __str__(self):
        return '{}: {}  {}'.format(self.data_set.title, self.key, self.value)

Original Serializers.py

class EntrySerializer(serializers.ModelSerializer):

    class Meta:
        model = Entry
        fields = '__all__'


class DataSetSerializer(serializers.ModelSerializer):

    entry_set = EntrySerializer(many=True)

    class Meta:
        model = DataSet
        fields = '__all__'

API output

{
    "id": 1,
    "entry_set": [
        {
            "id": 1,
            "key": "sum_cc",
            "value": 100,
            "data_set": 1
        },
        {
            "id": 2,
            "key": "sum_cm",
            "value": 80,
            "data_set": 1
        },
        {
            "id": 3,
            "key": "sum_dp",
            "value": 75,
            "data_set": 1
        }
    ],
    "title": "Dataset 1"
},

I replaced the line entry_set = EntrySerializer(many=True) in DataSetSerializer with the following:

entries = serializers.SerializerMethodField()
def get_entries(self, obj):
    return {d.key: d.value for d in obj.entry_set.all()}

and the output is:

{
    "id": 1,
    "entries": {
        "sum_cc": 100,
        "sum_cm": 80,
        "sum_dp": 75
    },
    "title": "Dataset 1"
},

Hope it helps someone else with the same issue

Upvotes: 2

Phuong Vu
Phuong Vu

Reputation: 537

My approaching is overwrite to_representation method of ModelSerializer. Here is addition method on your NewsFeedSerializer

class NewsFeedSerializer(serializers.ModelSerializer):
    """Serializer to map the Model instance into JSON format."""

    def to_representation(self, instance):
        data = super(NewsFeedSerializer, self).to_representation(instance)
        """Modify your response data here"""
        return dict(feeds=data)

Upvotes: 0

Related Questions