diff --git a/rest_framework_json_api/utils.py b/rest_framework_json_api/utils.py index cca154f3..59fb266d 100644 --- a/rest_framework_json_api/utils.py +++ b/rest_framework_json_api/utils.py @@ -164,7 +164,9 @@ def build_json_resource_obj(fields, resource, resource_instance, resource_name): def get_related_resource_type(relation): - if hasattr(relation, 'get_queryset') and relation.get_queryset() is not None: + if hasattr(relation, '_meta'): + relation_model = relation._meta.model + elif hasattr(relation, 'get_queryset') and relation.get_queryset() is not None: relation_model = relation.get_queryset().model else: parent_serializer = relation.parent @@ -266,11 +268,10 @@ def extract_relationships(fields, resource, resource_instance): if isinstance(field, ManyRelatedField): relation_data = list() - related_object = field.child_relation - relation_type = get_related_resource_type(related_object) for related_object in relation_instance_or_manager.all(): + related_object_type = get_related_resource_type(related_object) relation_data.append(OrderedDict([ - ('type', relation_type), + ('type', related_object_type), ('id', encoding.force_text(related_object.pk)) ])) data.update({ @@ -285,20 +286,18 @@ def extract_relationships(fields, resource, resource_instance): if isinstance(field, ListSerializer): relation_data = list() - serializer = field.child - relation_model = serializer.Meta.model - relation_type = format_relation_name(relation_model.__name__) serializer_data = resource.get(field_name) resource_instance_queryset = relation_instance_or_manager.all() if isinstance(serializer_data, list): for position in range(len(serializer_data)): nested_resource_instance = resource_instance_queryset[position] - relation_data.append( - OrderedDict( - [('type', relation_type), ('id', encoding.force_text(nested_resource_instance.pk))] - ) - ) + nested_resource_instance_type = get_related_resource_type( + nested_resource_instance) + relation_data.append(OrderedDict([ + ('type', nested_resource_instance_type), + ('id', encoding.force_text(nested_resource_instance.pk)) + ])) data.update({field_name: {'data': relation_data}}) continue