mirror of
				https://github.com/encode/django-rest-framework.git
				synced 2025-11-04 09:57:55 +03:00 
			
		
		
		
	Allow run_validators() to handle non-dict types. (#6365)
Fixes #6053. Original test case thanks to Vincent Delaitre in #6242.
This commit is contained in:
		
							parent
							
								
									0cf18c4163
								
							
						
					
					
						commit
						587058e3c2
					
				| 
						 | 
					@ -461,8 +461,11 @@ class Serializer(BaseSerializer):
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        Add read_only fields with defaults to value before running validators.
 | 
					        Add read_only fields with defaults to value before running validators.
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        to_validate = self._read_only_defaults()
 | 
					        if isinstance(value, dict):
 | 
				
			||||||
        to_validate.update(value)
 | 
					            to_validate = self._read_only_defaults()
 | 
				
			||||||
 | 
					            to_validate.update(value)
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            to_validate = value
 | 
				
			||||||
        super(Serializer, self).run_validators(to_validate)
 | 
					        super(Serializer, self).run_validators(to_validate)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def to_internal_value(self, data):
 | 
					    def to_internal_value(self, data):
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -156,6 +156,33 @@ class TestSerializer:
 | 
				
			||||||
        assert serializer.validated_data == {'char': 'abc', 'integer': 123}
 | 
					        assert serializer.validated_data == {'char': 'abc', 'integer': 123}
 | 
				
			||||||
        assert serializer.errors == {}
 | 
					        assert serializer.errors == {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_custom_to_internal_value(self):
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        to_internal_value() is expected to return a dict, but subclasses may
 | 
				
			||||||
 | 
					        return application specific type.
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        class Point(object):
 | 
				
			||||||
 | 
					            def __init__(self, srid, x, y):
 | 
				
			||||||
 | 
					                self.srid = srid
 | 
				
			||||||
 | 
					                self.coords = (x, y)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # 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 Point(srid=4326, **kwargs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        serializer = NestedPointSerializer(data={'longitude': 6.958307, 'latitude': 50.941357})
 | 
				
			||||||
 | 
					        assert serializer.is_valid()
 | 
				
			||||||
 | 
					        assert isinstance(serializer.validated_data, 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 == {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TestValidateMethod:
 | 
					class TestValidateMethod:
 | 
				
			||||||
    def test_non_field_error_validate_method(self):
 | 
					    def test_non_field_error_validate_method(self):
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user