From 32647eda1f3350605c829eabd680bc97a5c2b300 Mon Sep 17 00:00:00 2001 From: Gordon Cassie Date: Mon, 24 Nov 2014 08:41:12 -0500 Subject: [PATCH] Initial work at implementing ReturnDict and ReturnList for nested serializers. --- rest_framework/serializers.py | 10 +++++++--- tests/test_serializer_nested.py | 15 +++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 2d5c843e5..66ff2fcf4 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -363,6 +363,8 @@ class Serializer(BaseSerializer): attribute = field.get_attribute(instance) if attribute is None: value = None + elif isinstance(field, Serializer): + value = field.__class__(attribute).data else: value = field.to_representation(attribute) transform_method = getattr(self, 'transform_' + field.field_name, None) @@ -479,9 +481,11 @@ class ListSerializer(BaseSerializer): List of object instances -> List of dicts of primitive datatypes. """ iterable = data.all() if (hasattr(data, 'all')) else data - return [ - self.child.to_representation(item) for item in iterable - ] + if isinstance(self.child, Serializer): + serializer = self.child.__class__ + return [serializer(item).data for item in iterable] + else: + return [self.child.to_representation(item) for item in iterable] def update(self, instance, validated_data): raise NotImplementedError( diff --git a/tests/test_serializer_nested.py b/tests/test_serializer_nested.py index 5e2074490..24d45c128 100644 --- a/tests/test_serializer_nested.py +++ b/tests/test_serializer_nested.py @@ -1,4 +1,5 @@ from rest_framework import serializers +from rest_framework.utils.serializer_helpers import ReturnDict class TestNestedSerializer: @@ -39,6 +40,20 @@ class TestNestedSerializer: serializer = self.Serializer() assert serializer.data == expected_data + def test_nested_field_uses_return_dict(self): + input_data = { + 'nested': { + 'one': '1', + 'two': '2', + } + } + serializer = self.Serializer(input_data) + assert isinstance(serializer.data['nested'], ReturnDict) + + def test_empty_nested_field_uses_return_dict(self): + serializer = self.Serializer() + assert isinstance(serializer.data['nested'], ReturnDict) + # """ # Tests to cover nested serializers.