@@ -402,8 +402,11 @@ def extract_relationships(fields, resource, resource_instance):
402402
403403
404404def extract_included (fields , resource , resource_instance , included_resources ):
405- included_data = list ()
405+ # this function may be called with an empty record (example: Browsable Interface)
406+ if not resource_instance :
407+ return
406408
409+ included_data = list ()
407410 current_serializer = fields .serializer
408411 context = current_serializer .context
409412 included_serializers = get_included_serializers (current_serializer )
@@ -419,13 +422,19 @@ def extract_included(fields, resource, resource_instance, included_resources):
419422
420423 try :
421424 included_resources .remove (field_name )
422- new_included_resources = [key .replace ('%s.' % field_name , '' , 1 ) for key in included_resources ]
423- relation_instance_or_manager = getattr (resource_instance , field_name )
424- serializer_data = resource .get (field_name )
425425 except ValueError :
426426 # Skip fields not in requested included resources
427427 continue
428428
429+ try :
430+ relation_instance_or_manager = getattr (resource_instance , field_name )
431+ except AttributeError :
432+ # For ManyRelatedFields if `related_name` is not set we need to access `foo_set` from `source`
433+ relation_instance_or_manager = getattr (resource_instance , field .child_relation .source )
434+
435+ new_included_resources = [key .replace ('%s.' % field_name , '' , 1 ) for key in included_resources ]
436+ serializer_data = resource .get (field_name )
437+
429438 if isinstance (field , ManyRelatedField ):
430439 serializer_class = included_serializers .get (field_name )
431440 field = serializer_class (relation_instance_or_manager .all (), many = True , context = context )
0 commit comments