@@ -45,6 +45,17 @@ def restore_object(self, data, instance=None):
45
45
return instance
46
46
47
47
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
+
48
59
class BookSerializer (serializers .ModelSerializer ):
49
60
isbn = serializers .RegexField (regex = r'^[0-9]{13}$' , error_messages = {'invalid' : 'isbn has to be exact 13 numbers' })
50
61
@@ -155,6 +166,42 @@ def test_create(self):
155
166
self .assertFalse (serializer .object is expected )
156
167
self .assertEqual (serializer .data ['sub_comment' ], 'And Merry Christmas!' )
157
168
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
+
158
205
def test_update (self ):
159
206
serializer = CommentSerializer (self .comment , data = self .data )
160
207
expected = self .comment
0 commit comments