@@ -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,12 +422,18 @@ 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
428+ else :
429+ new_included_resources = [key .replace ('%s.' % field_name , '' , 1 ) for key in included_resources ]
430+ serializer_data = resource .get (field_name )
431+
432+ try :
433+ relation_instance_or_manager = getattr (resource_instance , field_name )
434+ except AttributeError :
435+ # For ManyRelatedFields if `related_name` is not set we need to access `foo_set` from `source`
436+ relation_instance_or_manager = getattr (resource_instance , field .child_relation .source )
428437
429438 if isinstance (field , ManyRelatedField ):
430439 serializer_class = included_serializers .get (field_name )
0 commit comments