Skip to content

Commit 389db44

Browse files
committed
Added support for HyperlinkedIdentityField
1 parent 25e693a commit 389db44

File tree

1 file changed

+29
-5
lines changed

1 file changed

+29
-5
lines changed

rest_framework_json_api/utils.py

+29-5
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
from django.utils import six, encoding
88
from django.utils.translation import ugettext_lazy as _
99
from rest_framework.serializers import BaseSerializer, ListSerializer, ModelSerializer
10-
from rest_framework.relations import RelatedField, HyperlinkedRelatedField, PrimaryKeyRelatedField
10+
from rest_framework.relations import RelatedField, HyperlinkedRelatedField, PrimaryKeyRelatedField, \
11+
HyperlinkedIdentityField
1112
from rest_framework.settings import api_settings
1213
from rest_framework.exceptions import APIException
1314

@@ -152,10 +153,15 @@ def get_related_resource_type(relation):
152153
parent_model = parent_serializer.Meta.model
153154
else:
154155
parent_model = parent_serializer.parent.Meta.model
155-
parent_model_relation = getattr(
156-
parent_model,
157-
(relation.source if relation.source else parent_serializer.field_name)
158-
)
156+
157+
if relation.source:
158+
if relation.source != '*':
159+
parent_model_relation = getattr(parent_model, relation.source)
160+
else:
161+
parent_model_relation = getattr(parent_model, relation.field_name)
162+
else:
163+
parent_model_relation = getattr(parent_model, parent_serializer.field_name)
164+
159165
if hasattr(parent_model_relation, 'related'):
160166
relation_model = parent_model_relation.related.model
161167
elif hasattr(parent_model_relation, 'field'):
@@ -231,6 +237,24 @@ def extract_relationships(fields, resource, resource_instance):
231237
}})
232238
continue
233239

240+
if isinstance(field, HyperlinkedIdentityField):
241+
# special case for HyperlinkedIdentityField
242+
relation_data = list()
243+
relation_type = get_related_resource_type(field)
244+
related = getattr(resource_instance, field_name).all()
245+
for relation in related:
246+
relation_data.append(OrderedDict([('type', relation_type), ('id', relation.pk)]))
247+
248+
data.update({field_name: {
249+
'links': {
250+
"related": resource.get(field_name)},
251+
'data': relation_data,
252+
'meta': {
253+
'count': len(relation_data)
254+
}
255+
}})
256+
continue
257+
234258
if isinstance(field, (PrimaryKeyRelatedField, HyperlinkedRelatedField)):
235259
relation_type = get_related_resource_type(field)
236260
relation_id = getattr(resource_instance, field_name).pk if resource.get(field_name) else None

0 commit comments

Comments
 (0)