Reputation: 119
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
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
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