Skip to content

Commit 6d425aa

Browse files
committed
Merge pull request encode#831 from brianz/master
Allow nested fields to be missing
2 parents 0c95405 + 24c9c45 commit 6d425aa

File tree

2 files changed

+48
-1
lines changed

2 files changed

+48
-1
lines changed

rest_framework/fields.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ def get_component(obj, attr_name):
5252
return that attribute on the object.
5353
"""
5454
if isinstance(obj, dict):
55-
val = obj[attr_name]
55+
val = obj.get(attr_name)
5656
else:
5757
val = getattr(obj, attr_name)
5858

rest_framework/tests/serializer.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,17 @@ def restore_object(self, data, instance=None):
4545
return instance
4646

4747

48+
class NamesSerializer(serializers.Serializer):
49+
first = serializers.CharField()
50+
last = serializers.CharField(required=False, default='')
51+
initials = serializers.CharField(required=False, default='')
52+
53+
54+
class PersonIdentifierSerializer(serializers.Serializer):
55+
ssn = serializers.CharField()
56+
names = NamesSerializer(source='names', required=False)
57+
58+
4859
class BookSerializer(serializers.ModelSerializer):
4960
isbn = serializers.RegexField(regex=r'^[0-9]{13}$', error_messages={'invalid': 'isbn has to be exact 13 numbers'})
5061

@@ -155,6 +166,42 @@ def test_create(self):
155166
self.assertFalse(serializer.object is expected)
156167
self.assertEqual(serializer.data['sub_comment'], 'And Merry Christmas!')
157168

169+
def test_create_nested(self):
170+
"""Test a serializer with nested data."""
171+
names = {'first': 'John', 'last': 'Doe', 'initials': 'jd'}
172+
data = {'ssn': '1234567890', 'names': names}
173+
serializer = PersonIdentifierSerializer(data=data)
174+
175+
self.assertEqual(serializer.is_valid(), True)
176+
self.assertEqual(serializer.object, data)
177+
self.assertFalse(serializer.object is data)
178+
self.assertEqual(serializer.data['names'], names)
179+
180+
def test_create_partial_nested(self):
181+
"""Test a serializer with nested data which has missing fields."""
182+
names = {'first': 'John'}
183+
data = {'ssn': '1234567890', 'names': names}
184+
serializer = PersonIdentifierSerializer(data=data)
185+
186+
expected_names = {'first': 'John', 'last': '', 'initials': ''}
187+
data['names'] = expected_names
188+
189+
self.assertEqual(serializer.is_valid(), True)
190+
self.assertEqual(serializer.object, data)
191+
self.assertFalse(serializer.object is expected_names)
192+
self.assertEqual(serializer.data['names'], expected_names)
193+
194+
def test_null_nested(self):
195+
"""Test a serializer with a nonexistent nested field"""
196+
data = {'ssn': '1234567890'}
197+
serializer = PersonIdentifierSerializer(data=data)
198+
199+
self.assertEqual(serializer.is_valid(), True)
200+
self.assertEqual(serializer.object, data)
201+
self.assertFalse(serializer.object is data)
202+
expected = {'ssn': '1234567890', 'names': None}
203+
self.assertEqual(serializer.data, expected)
204+
158205
def test_update(self):
159206
serializer = CommentSerializer(self.comment, data=self.data)
160207
expected = self.comment

0 commit comments

Comments
 (0)