diff options
| -rw-r--r-- | rest_framework/serializers.py | 4 | ||||
| -rw-r--r-- | rest_framework/tests/test_serializer.py | 25 | 
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):  | 
