diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 110ffbfa98..b30c06c955 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -431,10 +431,11 @@ def run_validation(self, data=empty): if is_empty_value: return data - value = self.to_internal_value(data) + value = self._to_primitive_value(data) try: self.run_validators(value) value = self.validate(value) + value = self.to_internal_value(value) assert value is not None, '.validate() should return the validated data' except (ValidationError, DjangoValidationError) as exc: raise ValidationError(detail=as_serializer_error(exc)) @@ -465,7 +466,7 @@ def run_validators(self, value): to_validate.update(value) super(Serializer, self).run_validators(to_validate) - def to_internal_value(self, data): + def _to_primitive_value(self, data): """ Dict of native values <- Dict of primitive datatypes. """ @@ -502,6 +503,12 @@ def to_internal_value(self, data): return ret + def to_internal_value(self, data): + """ + Converts a dict of primitive datatypes into the internal format + """ + return data + def to_representation(self, instance): """ Object instance -> Dict of primitive datatypes. diff --git a/tests/test_serializer.py b/tests/test_serializer.py index 0650b7c570..26125dfe65 100644 --- a/tests/test_serializer.py +++ b/tests/test_serializer.py @@ -613,3 +613,32 @@ class Grandchild(Child): assert len(Parent().get_fields()) == 2 assert len(Child().get_fields()) == 2 assert len(Grandchild().get_fields()) == 2 + + +class Test5922Regression: + class Point(object): + def __init__(self, srid, x, y): + self.srid = srid + self.coords = (x, y) + + def setup(self): + + # Declares a serializer that converts data into an object + class NestedPointSerializer(serializers.Serializer): + longitude = serializers.FloatField(source='x') + latitude = serializers.FloatField(source='y') + + def to_internal_value(self, data): + kwargs = super(NestedPointSerializer, self).to_internal_value(data) + return Test5922Regression.Point(srid=4326, **kwargs) + + self.Serializer = NestedPointSerializer + + def test_5922_regression(self): + serializer = self.Serializer(data={'longitude': 6.958307, 'latitude': 50.941357}) + assert serializer.is_valid() + assert isinstance(serializer.validated_data, Test5922Regression.Point) + assert serializer.validated_data.srid == 4326 + assert serializer.validated_data.coords[0] == 6.958307 + assert serializer.validated_data.coords[1] == 50.941357 + assert serializer.errors == {}