@@ -203,6 +203,155 @@ def update(self, instance, validated_data):
203203 assert updated_instances == expected_output
204204
205205
206+ class TestListSerializerInstanceMatching :
207+ def test_matching_with_id (self ):
208+ seen_instances = []
209+
210+ class TestSerializer (serializers .Serializer ):
211+ id = serializers .IntegerField ()
212+
213+ def validate (self , attrs ):
214+ seen_instances .append (self .instance )
215+ return attrs
216+
217+ instance = [
218+ BasicObject (id = 1 ),
219+ BasicObject (id = 2 ),
220+ ]
221+ input_data = [
222+ {'id' : 1 },
223+ {'id' : 2 },
224+ ]
225+
226+ serializer = TestSerializer (instance , data = input_data , many = True )
227+ assert serializer .is_valid ()
228+ assert seen_instances == instance
229+
230+ def test_matching_with_pk (self ):
231+ seen_instances = []
232+
233+ class TestSerializer (serializers .Serializer ):
234+ pk = serializers .IntegerField ()
235+
236+ def validate (self , attrs ):
237+ seen_instances .append (self .instance )
238+ return attrs
239+
240+ instance = [
241+ BasicObject (pk = 1 ),
242+ BasicObject (pk = 2 ),
243+ ]
244+ input_data = [
245+ {'pk' : 1 },
246+ {'pk' : 2 },
247+ ]
248+
249+ serializer = TestSerializer (instance , data = input_data , many = True )
250+ assert serializer .is_valid ()
251+ assert seen_instances == instance
252+
253+ def test_matching_with_id_against_object_with_pk_only (self ):
254+ seen_instances = []
255+
256+ class TestSerializer (serializers .Serializer ):
257+ id = serializers .IntegerField ()
258+
259+ def validate (self , attrs ):
260+ seen_instances .append (self .instance )
261+ return attrs
262+
263+ instance = [BasicObject (pk = 1 )]
264+ input_data = [{'id' : 1 }]
265+
266+ serializer = TestSerializer (instance , data = input_data , many = True )
267+ assert serializer .is_valid ()
268+ assert seen_instances == instance
269+
270+ def test_mapping_instance_matching (self ):
271+ seen_instances = []
272+
273+ class TestSerializer (serializers .Serializer ):
274+ id = serializers .IntegerField ()
275+
276+ def validate (self , attrs ):
277+ seen_instances .append (self .instance )
278+ return attrs
279+
280+ obj1 = BasicObject (id = 1 )
281+ obj2 = BasicObject (id = 2 )
282+ instance = {
283+ '1' : obj1 ,
284+ '2' : obj2 ,
285+ }
286+ input_data = [
287+ {'id' : 1 },
288+ {'id' : 2 },
289+ ]
290+
291+ serializer = TestSerializer (instance , data = input_data , many = True )
292+ assert serializer .is_valid ()
293+ assert seen_instances == [obj1 , obj2 ]
294+
295+ def test_unsupported_instance_type_preserves_original_behavior (self ):
296+ seen_instances = []
297+
298+ class TestSerializer (serializers .Serializer ):
299+ id = serializers .IntegerField ()
300+
301+ def validate (self , attrs ):
302+ seen_instances .append (self .instance )
303+ return attrs
304+
305+ serializer = TestSerializer (instance = 123 , data = [{'id' : 1 }], many = True )
306+ assert serializer .is_valid ()
307+ assert seen_instances == [123 ]
308+
309+ def test_missing_lookup_field_in_data_does_not_assign_instance (self ):
310+ seen_instances = []
311+
312+ class TestSerializer (serializers .Serializer ):
313+ id = serializers .IntegerField (required = False )
314+
315+ class Meta :
316+ lookup_field = 'uuid'
317+
318+ def validate (self , attrs ):
319+ seen_instances .append (self .instance )
320+ return attrs
321+
322+ class TestListSerializer (serializers .ListSerializer ):
323+ child = TestSerializer ()
324+
325+ serializer = TestListSerializer (
326+ instance = [BasicObject (id = 1 , uuid = 'uuid-1' )],
327+ data = [{'id' : 1 }],
328+ )
329+ assert serializer .is_valid ()
330+ assert seen_instances == [None ]
331+
332+ def test_matching_with_configurable_lookup_field (self ):
333+ seen_instances = []
334+
335+ class TestSerializer (serializers .Serializer ):
336+ id = serializers .IntegerField (required = False )
337+ uuid = serializers .CharField ()
338+
339+ class Meta :
340+ lookup_field = 'uuid'
341+
342+ def validate (self , attrs ):
343+ seen_instances .append (self .instance )
344+ return attrs
345+
346+ obj1 = BasicObject (id = 1 , uuid = 'uuid-1' )
347+ obj2 = BasicObject (id = 2 , uuid = 'uuid-2' )
348+ input_data = [{'id' : 1 , 'uuid' : 'uuid-2' }]
349+
350+ serializer = TestSerializer ([obj1 , obj2 ], data = input_data , many = True )
351+ assert serializer .is_valid ()
352+ assert seen_instances == [obj2 ]
353+
354+
206355class TestNestedListSerializer :
207356 """
208357 Tests for using a ListSerializer as a field.
0 commit comments