From 2b48906ca6e8b09a149af4e702dc619d3d15138e Mon Sep 17 00:00:00 2001 From: Daniel Salazar Date: Fri, 16 Oct 2015 16:25:35 +0200 Subject: [PATCH] Initializes _errors attribute and update parent errors --- rest_framework/serializers.py | 5 +++++ tests/test_serializer_nested.py | 36 +++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index aef815a88..4e2c2de1f 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -292,6 +292,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) @@ -432,6 +434,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)