@@ -43,6 +43,17 @@ def restore_object(self, data, instance=None):
43
43
return instance
44
44
45
45
46
+ class NamesSerializer (serializers .Serializer ):
47
+ first = serializers .CharField ()
48
+ last = serializers .CharField (required = False , default = '' )
49
+ initials = serializers .CharField (required = False , default = '' )
50
+
51
+
52
+ class PersonIdentifierSerializer (serializers .Serializer ):
53
+ ssn = serializers .CharField ()
54
+ names = NamesSerializer (source = 'names' , required = False )
55
+
56
+
46
57
class BookSerializer (serializers .ModelSerializer ):
47
58
isbn = serializers .RegexField (regex = r'^[0-9]{13}$' , error_messages = {'invalid' : 'isbn has to be exact 13 numbers' })
48
59
@@ -141,6 +152,42 @@ def test_create(self):
141
152
self .assertFalse (serializer .object is expected )
142
153
self .assertEqual (serializer .data ['sub_comment' ], 'And Merry Christmas!' )
143
154
155
+ def test_create_nested (self ):
156
+ """Test a serializer with nested data."""
157
+ names = {'first' : 'John' , 'last' : 'Doe' , 'initials' : 'jd' }
158
+ data = {'ssn' : '1234567890' , 'names' : names }
159
+ serializer = PersonIdentifierSerializer (data = data )
160
+
161
+ self .assertEqual (serializer .is_valid (), True )
162
+ self .assertEqual (serializer .object , data )
163
+ self .assertFalse (serializer .object is data )
164
+ self .assertEqual (serializer .data ['names' ], names )
165
+
166
+ def test_create_partial_nested (self ):
167
+ """Test a serializer with nested data which has missing fields."""
168
+ names = {'first' : 'John' }
169
+ data = {'ssn' : '1234567890' , 'names' : names }
170
+ serializer = PersonIdentifierSerializer (data = data )
171
+
172
+ expected_names = {'first' : 'John' , 'last' : '' , 'initials' : '' }
173
+ data ['names' ] = expected_names
174
+
175
+ self .assertEqual (serializer .is_valid (), True )
176
+ self .assertEqual (serializer .object , data )
177
+ self .assertFalse (serializer .object is expected_names )
178
+ self .assertEqual (serializer .data ['names' ], expected_names )
179
+
180
+ def test_null_nested (self ):
181
+ """Test a serializer with a nonexistent nested field"""
182
+ data = {'ssn' : '1234567890' }
183
+ serializer = PersonIdentifierSerializer (data = data )
184
+
185
+ self .assertEqual (serializer .is_valid (), True )
186
+ self .assertEqual (serializer .object , data )
187
+ self .assertFalse (serializer .object is data )
188
+ expected = {'ssn' : '1234567890' , 'names' : None }
189
+ self .assertEqual (serializer .data , expected )
190
+
144
191
def test_update (self ):
145
192
serializer = CommentSerializer (self .comment , data = self .data )
146
193
expected = self .comment
0 commit comments