Skip to content

Commit bafb3ec

Browse files
author
Carlton Gibson
authored
Merge pull request #5375 from rpkilby/related-source-serialization
Fix default value handling for dotted sources
2 parents 7e3ba8b + 07258ca commit bafb3ec

File tree

2 files changed

+13
-3
lines changed

2 files changed

+13
-3
lines changed

rest_framework/fields.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,6 @@ def get_attribute(instance, attrs):
9393
Also accepts either attribute lookup on objects or dictionary lookups.
9494
"""
9595
for attr in attrs:
96-
if instance is None:
97-
# Break out early if we get `None` at any point in a nested lookup.
98-
return None
9996
try:
10097
if isinstance(instance, collections.Mapping):
10198
instance = instance[attr]

tests/test_serializer.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,19 @@ def test_default_not_used_when_in_object(self):
411411
serializer = self.Serializer(instance)
412412
assert serializer.data == {'has_default': 'def', 'has_default_callable': 'ghi', 'no_default': 'abc'}
413413

414+
def test_default_for_source_source(self):
415+
"""
416+
'default="something"' should be used when a traversed attribute is missing from input.
417+
"""
418+
class Serializer(serializers.Serializer):
419+
traversed = serializers.CharField(default='x', source='traversed.attr')
420+
421+
assert Serializer({}).data == {'traversed': 'x'}
422+
assert Serializer({'traversed': {}}).data == {'traversed': 'x'}
423+
assert Serializer({'traversed': None}).data == {'traversed': 'x'}
424+
425+
assert Serializer({'traversed': {'attr': 'abc'}}).data == {'traversed': 'abc'}
426+
414427

415428
class TestCacheSerializerData:
416429
def test_cache_serializer_data(self):

0 commit comments

Comments
 (0)