From c864c970cf965daa59f81ac2fa14979e71873da9 Mon Sep 17 00:00:00 2001 From: Martin Maillard Date: Thu, 17 Sep 2015 16:42:54 +0200 Subject: [PATCH] Extract type for each related instance Instead of extracting the resource type for the whole related collection, extract the type for each instance individually. This way, polymorphic relationships (using something like django_polymorphic) are supported. --- rest_framework_json_api/utils.py | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) 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