Fix for case of ListSerializer with single item (#4609)

This commit is contained in:
Tom Christie 2016-10-21 15:21:23 +01:00 committed by GitHub
parent 0b346e94b1
commit f1bdce17b5
2 changed files with 15 additions and 2 deletions

View File

@ -507,7 +507,7 @@ class Serializer(BaseSerializer):
@property @property
def errors(self): def errors(self):
ret = super(Serializer, self).errors ret = super(Serializer, self).errors
if isinstance(ret, list) and len(ret) == 1 and ret[0].code == 'null': if isinstance(ret, list) and len(ret) == 1 and getattr(ret[0], 'code', None) == 'null':
# Edge case. Provide a more descriptive error than # Edge case. Provide a more descriptive error than
# "this field may not be null", when no data is passed. # "this field may not be null", when no data is passed.
detail = ErrorDetail('No data provided', code='null') detail = ErrorDetail('No data provided', code='null')
@ -705,7 +705,7 @@ class ListSerializer(BaseSerializer):
@property @property
def errors(self): def errors(self):
ret = super(ListSerializer, self).errors ret = super(ListSerializer, self).errors
if isinstance(ret, list) and len(ret) == 1 and ret[0].code == 'null': if isinstance(ret, list) and len(ret) == 1 and getattr(ret[0], 'code', None) == 'null':
# Edge case. Provide a more descriptive error than # Edge case. Provide a more descriptive error than
# "this field may not be null", when no data is passed. # "this field may not be null", when no data is passed.
detail = ErrorDetail('No data provided', code='null') detail = ErrorDetail('No data provided', code='null')

View File

@ -357,3 +357,16 @@ class TestSerializerValidationWithCompiledRegexField:
assert serializer.is_valid() assert serializer.is_valid()
assert serializer.validated_data == {'name': '2'} assert serializer.validated_data == {'name': '2'}
assert serializer.errors == {} assert serializer.errors == {}
class Test4606Regression:
def setup(self):
class ExampleSerializer(serializers.Serializer):
name = serializers.CharField(required=True)
choices = serializers.CharField(required=True)
self.Serializer = ExampleSerializer
def test_4606_regression(self):
serializer = self.Serializer(data=[{"name": "liz"}], many=True)
with pytest.raises(serializers.ValidationError):
serializer.is_valid(raise_exception=True)