Skip to content

Commit b419970

Browse files
authored
Handle empty data with serializer (encode#4564)
1 parent 4c9b14b commit b419970

File tree

3 files changed

+22
-0
lines changed

3 files changed

+22
-0
lines changed

rest_framework/serializers.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,11 @@ def data(self):
507507
@property
508508
def errors(self):
509509
ret = super(Serializer, self).errors
510+
if isinstance(ret, list) and len(ret) == 1 and ret[0].code == 'null':
511+
# Edge case. Provide a more descriptive error than
512+
# "this field may not be null", when no data is passed.
513+
detail = ErrorDetail('No data provided', code='null')
514+
ret = {api_settings.NON_FIELD_ERRORS_KEY: [detail]}
510515
return ReturnDict(ret, serializer=self)
511516

512517

@@ -700,6 +705,11 @@ def data(self):
700705
@property
701706
def errors(self):
702707
ret = super(ListSerializer, self).errors
708+
if isinstance(ret, list) and len(ret) == 1 and ret[0].code == 'null':
709+
# Edge case. Provide a more descriptive error than
710+
# "this field may not be null", when no data is passed.
711+
detail = ErrorDetail('No data provided', code='null')
712+
ret = {api_settings.NON_FIELD_ERRORS_KEY: [detail]}
703713
if isinstance(ret, dict):
704714
return ReturnDict(ret, serializer=self)
705715
return ReturnList(ret, serializer=self)

tests/test_serializer.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,12 @@ def create(validated_data):
6262
with pytest.raises(AssertionError):
6363
serializer.save()
6464

65+
def test_validate_none_data(self):
66+
data = None
67+
serializer = self.Serializer(data=data)
68+
assert not serializer.is_valid()
69+
assert serializer.errors == {'non_field_errors': ['No data provided']}
70+
6571

6672
class TestValidateMethod:
6773
def test_non_field_error_validate_method(self):

tests/test_serializer_nested.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@ def test_nested_serialize_empty(self):
4141
serializer = self.Serializer()
4242
assert serializer.data == expected_data
4343

44+
def test_nested_serialize_no_data(self):
45+
data = None
46+
serializer = self.Serializer(data=data)
47+
assert not serializer.is_valid()
48+
assert serializer.errors == {'non_field_errors': ['No data provided']}
49+
4450

4551
class TestNotRequiredNestedSerializer:
4652
def setup(self):

0 commit comments

Comments
 (0)