aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Christie2013-12-16 01:18:31 -0800
committerTom Christie2013-12-16 01:18:31 -0800
commit4bc829d4e993246e58781973e4b487b2f5686879 (patch)
tree201ea5125a714f8007331424f7dc3a0bfca4310b
parentfc2dee844ab0ca77928f296f13777bf01d94e6fd (diff)
parent4a134eefa2c3b71aa1dc6a4ec94716fe41dca8f5 (diff)
downloaddjango-rest-framework-4bc829d4e993246e58781973e4b487b2f5686879.tar.bz2
Merge pull request #1298 from craigds/fix-nested-serializers-with-renamed-fields
Fix nested serializers with renamed fields
-rw-r--r--rest_framework/serializers.py4
-rw-r--r--rest_framework/tests/test_serializer.py25
2 files changed, 28 insertions, 1 deletions
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py
index 40caa1f3..d9313342 100644
--- a/rest_framework/serializers.py
+++ b/rest_framework/serializers.py
@@ -422,7 +422,9 @@ class BaseSerializer(WritableField):
if self.source == '*':
if value:
- into.update(value)
+ reverted_data = self.restore_fields(value, {})
+ if not self._errors:
+ into.update(reverted_data)
else:
if value in (None, ''):
into[(self.source or field_name)] = None
diff --git a/rest_framework/tests/test_serializer.py b/rest_framework/tests/test_serializer.py
index 14d1c664..7808ba1a 100644
--- a/rest_framework/tests/test_serializer.py
+++ b/rest_framework/tests/test_serializer.py
@@ -105,6 +105,17 @@ class ModelSerializerWithNestedSerializer(serializers.ModelSerializer):
model = Person
+class NestedSerializerWithRenamedField(serializers.Serializer):
+ renamed_info = serializers.Field(source='info')
+
+
+class ModelSerializerWithNestedSerializerWithRenamedField(serializers.ModelSerializer):
+ nested = NestedSerializerWithRenamedField(source='*')
+
+ class Meta:
+ model = Person
+
+
class PersonSerializerInvalidReadOnly(serializers.ModelSerializer):
"""
Testing for #652.
@@ -456,6 +467,20 @@ class ValidationTests(TestCase):
)
self.assertEqual(serializer.is_valid(), True)
+ def test_writable_star_source_with_inner_source_fields(self):
+ """
+ Tests that a serializer with source="*" correctly expands the
+ it's fields into the outer serializer even if they have their
+ own 'source' parameters.
+ """
+
+ serializer = ModelSerializerWithNestedSerializerWithRenamedField(data={
+ 'name': 'marko',
+ 'nested': {'renamed_info': 'hi'}},
+ )
+ self.assertEqual(serializer.is_valid(), True)
+ self.assertEqual(serializer.errors, {})
+
class CustomValidationTests(TestCase):
class CommentSerializerWithFieldValidator(CommentSerializer):