diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 67cf432e0..24b5d4b59 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -295,6 +295,8 @@ class BaseSerializer(WritableField): field.initialize(parent=self, field_name=field_name) try: field.field_from_native(data, files, field_name, reverted_data) + if field.errors: + self._errors[field_name] = [field.errors] except ValidationError as err: self._errors[field_name] = list(err.messages) @@ -435,6 +437,9 @@ class BaseSerializer(WritableField): Override default so that the serializer can be used as a writable nested field across relationships. """ + + self._errors = {} + if self.read_only: return diff --git a/tests/test_serializer_nested.py b/tests/test_serializer_nested.py index c09c24db2..b7b6a3b32 100644 --- a/tests/test_serializer_nested.py +++ b/tests/test_serializer_nested.py @@ -347,3 +347,39 @@ class NestedModelSerializerUpdateTests(TestCase): result = deserialize.object result.save() self.assertEqual(result.id, john.id) + + +class PlainObjectWithNestedRepresentationDeserializationTest(TestCase): + def setUp(self): + class ArtistSerializer(serializers.Serializer): + artist_name = serializers.CharField(max_length=100) + artist_origin = serializers.CharField(max_length=100) + + class AlbumSerializer(serializers.Serializer): + album_name = serializers.CharField(max_length=100) + artist = ArtistSerializer(source='*') + + self.AlbumSerializer = AlbumSerializer + + def test_deserialize_invalid_nested_representation_error(self): + """ + Incorrect nested deserialization should return appropiate error data. + """ + + data = { + 'album_name': 'Discovery', + 'artist': { + 'artist_name': 'Daft Punk' + # Missing origin + } + } + + expected_errors = { + 'artist': [ + {'artist_origin': ['This field is required.']} + ] + } + + serializer = self.AlbumSerializer(data=data) + self.assertEqual(serializer.is_valid(), False) + self.assertEqual(serializer.errors, expected_errors)