I am using a UUIDField in a serializer as such:
class ExampleSerializer(serializers.Serializer):
some_id = serializers.UUIDField(required = False)
class ExampleView(APIView):
def post(self, request):
example_serializer = ExampleSerializer(data = request.data)
example_serializer.is_valid()
If I make a request to this view with the parameter some_id mapped to a list, e.g. {"some_id": [1, 2, 3]}, I get an AttributeError: list object has no attribute replace, even though the expected behavior is that the exception is caught by is_valid and its return value is False (since a list is clearly not valid input to a UUIDField)
The AttributeError is thrown by Python's uuid.py (I am on Python 3.4.3) at the following line of UUID's __init__ method:
if hex is not None:
hex = hex.replace('urn:', '').replace('uuid:', '')
I believe the issue lies in the to_internal_value method of UUIDField when it calls the UUID constructor to construct the field from the input data (code from https://github.com/tomchristie/django-rest-framework/blob/a8deb380ff70b5df8d3c62c9be981b60e363c7f9/rest_framework/fields.py#L767):
def to_internal_value(self, data):
if not isinstance(data, uuid.UUID):
try:
if isinstance(data, six.integer_types):
return uuid.UUID(int=data)
else:
return uuid.UUID(hex=data)
except (ValueError, TypeError):
self.fail('invalid', value=data)
return data
Shouldn't AttributeError also be caught here before calling self.fail (to register validation failure)?
I an on djangorestframework version 3.3.1
Thanks for taking a look!
I am using a UUIDField in a serializer as such:
If I make a request to this view with the parameter some_id mapped to a list, e.g.
{"some_id": [1, 2, 3]}, I get anAttributeError: list object has no attribute replace, even though the expected behavior is that the exception is caught byis_validand its return value isFalse(since a list is clearly not valid input to a UUIDField)The
AttributeErroris thrown by Python's uuid.py (I am on Python 3.4.3) at the following line of UUID's__init__method:I believe the issue lies in the
to_internal_valuemethod of UUIDField when it calls the UUID constructor to construct the field from the input data (code from https://github.com/tomchristie/django-rest-framework/blob/a8deb380ff70b5df8d3c62c9be981b60e363c7f9/rest_framework/fields.py#L767):Shouldn't
AttributeErroralso be caught here before callingself.fail(to register validation failure)?I an on djangorestframework version 3.3.1
Thanks for taking a look!