From 389db446457c99c1e3d2d1cf35ed2eccbfaac60d Mon Sep 17 00:00:00 2001 From: Jonathan Senecal Date: Mon, 14 Sep 2015 12:44:01 -0400 Subject: [PATCH 1/2] Added support for HyperlinkedIdentityField --- rest_framework_json_api/utils.py | 34 +++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/rest_framework_json_api/utils.py b/rest_framework_json_api/utils.py index 4d1fc90a..ce724493 100644 --- a/rest_framework_json_api/utils.py +++ b/rest_framework_json_api/utils.py @@ -7,7 +7,8 @@ from django.utils import six, encoding from django.utils.translation import ugettext_lazy as _ from rest_framework.serializers import BaseSerializer, ListSerializer, ModelSerializer -from rest_framework.relations import RelatedField, HyperlinkedRelatedField, PrimaryKeyRelatedField +from rest_framework.relations import RelatedField, HyperlinkedRelatedField, PrimaryKeyRelatedField, \ + HyperlinkedIdentityField from rest_framework.settings import api_settings from rest_framework.exceptions import APIException @@ -152,10 +153,15 @@ def get_related_resource_type(relation): parent_model = parent_serializer.Meta.model else: parent_model = parent_serializer.parent.Meta.model - parent_model_relation = getattr( - parent_model, - (relation.source if relation.source else parent_serializer.field_name) - ) + + if relation.source: + if relation.source != '*': + parent_model_relation = getattr(parent_model, relation.source) + else: + parent_model_relation = getattr(parent_model, relation.field_name) + else: + parent_model_relation = getattr(parent_model, parent_serializer.field_name) + if hasattr(parent_model_relation, 'related'): relation_model = parent_model_relation.related.model elif hasattr(parent_model_relation, 'field'): @@ -231,6 +237,24 @@ def extract_relationships(fields, resource, resource_instance): }}) continue + if isinstance(field, HyperlinkedIdentityField): + # special case for HyperlinkedIdentityField + relation_data = list() + relation_type = get_related_resource_type(field) + related = getattr(resource_instance, field_name).all() + for relation in related: + relation_data.append(OrderedDict([('type', relation_type), ('id', relation.pk)])) + + data.update({field_name: { + 'links': { + "related": resource.get(field_name)}, + 'data': relation_data, + 'meta': { + 'count': len(relation_data) + } + }}) + continue + if isinstance(field, (PrimaryKeyRelatedField, HyperlinkedRelatedField)): relation_type = get_related_resource_type(field) relation_id = getattr(resource_instance, field_name).pk if resource.get(field_name) else None From 8dfc3a653bd5252169bb59063ec3853bda2b728c Mon Sep 17 00:00:00 2001 From: Jonathan Senecal Date: Mon, 14 Sep 2015 12:45:40 -0400 Subject: [PATCH 2/2] Removed support for HyperlinkedRouterField (Replaced by HyperlinkedIdentityField) --- rest_framework_json_api/utils.py | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/rest_framework_json_api/utils.py b/rest_framework_json_api/utils.py index ce724493..27e4d81f 100644 --- a/rest_framework_json_api/utils.py +++ b/rest_framework_json_api/utils.py @@ -219,24 +219,6 @@ def extract_relationships(fields, resource, resource_instance): if not isinstance(field, (RelatedField, ManyRelatedField, BaseSerializer)): continue - if isinstance(field, HyperlinkedRouterField): - # special case for HyperlinkedRouterField - relation_data = list() - relation_type = get_related_resource_type(field) - related = getattr(resource_instance, field_name).all() - for relation in related: - relation_data.append(OrderedDict([('type', relation_type), ('id', relation.pk)])) - - data.update({field_name: { - 'links': { - "related": resource.get(field_name)}, - 'data': relation_data, - 'meta': { - 'count': len(relation_data) - } - }}) - continue - if isinstance(field, HyperlinkedIdentityField): # special case for HyperlinkedIdentityField relation_data = list()