@@ -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 )
@@ -420,12 +423,17 @@ def extract_included(fields, resource, resource_instance, included_resources):
420423 try :
421424 included_resources .remove (field_name )
422425 new_included_resources = [key .replace ('%s.' % field_name , '' , 1 ) for key in included_resources ]
423- relation_instance_or_manager = getattr (resource_instance , field_name )
424426 serializer_data = resource .get (field_name )
425427 except ValueError :
426428 # Skip fields not in requested included resources
427429 continue
428430
431+ try :
432+ relation_instance_or_manager = getattr (resource_instance , field_name )
433+ except AttributeError :
434+ # For ManyRelatedFields if `related_name` is not set we need to access `foo_set` from `source`
435+ relation_instance_or_manager = getattr (resource_instance , field .child_relation .source )
436+
429437 if isinstance (field , ManyRelatedField ):
430438 serializer_class = included_serializers .get (field_name )
431439 field = serializer_class (relation_instance_or_manager .all (), many = True , context = context )
0 commit comments