aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework
diff options
context:
space:
mode:
authorCraig de Stigter2013-12-16 15:51:43 +1300
committerCraig de Stigter2013-12-16 15:55:54 +1300
commit4a134eefa2c3b71aa1dc6a4ec94716fe41dca8f5 (patch)
treee751953ed2a441e6e73784d4f98ed9c8a5f0c23e /rest_framework
parent69fef838cce33b9079640f83cc03edc30f56f5f1 (diff)
downloaddjango-rest-framework-4a134eefa2c3b71aa1dc6a4ec94716fe41dca8f5.tar.bz2
Fix expansion of writable nested serializers where the inner fields have source set.
Diffstat (limited to 'rest_framework')
-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):