diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 098c3cd23..39987cd07 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -507,7 +507,7 @@ class Serializer(BaseSerializer): @property def errors(self): 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 # "this field may not be null", when no data is passed. detail = ErrorDetail('No data provided', code='null') @@ -705,7 +705,7 @@ class ListSerializer(BaseSerializer): @property def errors(self): 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 # "this field may not be null", when no data is passed. detail = ErrorDetail('No data provided', code='null') diff --git a/tests/test_serializer.py b/tests/test_serializer.py index a2817f6a4..32be39faa 100644 --- a/tests/test_serializer.py +++ b/tests/test_serializer.py @@ -357,3 +357,16 @@ class TestSerializerValidationWithCompiledRegexField: assert serializer.is_valid() assert serializer.validated_data == {'name': '2'} 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)