Skip to content

Commit 47933b0

Browse files
committed
Introduced support for nested relationships urls with drf-nested-routers
1 parent 403a4b2 commit 47933b0

File tree

1 file changed

+24
-0
lines changed

1 file changed

+24
-0
lines changed

rest_framework_json_api/utils.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@
2323
except ImportError:
2424
ManyRelatedField = type(None)
2525

26+
try:
27+
from rest_framework_nested.relations import HyperlinkedRouterField
28+
except ImportError:
29+
HyperlinkedRouterField = type(None)
30+
2631

2732
def get_resource_name(context):
2833
"""
@@ -209,6 +214,25 @@ def extract_relationships(fields, resource):
209214
if not isinstance(field, (RelatedField, ManyRelatedField, BaseSerializer)):
210215
continue
211216

217+
if isinstance(field, HyperlinkedRouterField):
218+
# special case for HyperlinkedRouterField
219+
relation_data = list()
220+
relation_type = get_related_resource_type(field)
221+
parent_instance = field.parent.instance
222+
related = getattr(parent_instance, field_name).all() if hasattr(parent_instance, field_name) else list()
223+
for relation in related:
224+
relation_data.append(OrderedDict([('type', relation_type), ('id', relation.pk)]))
225+
226+
data.update({field_name: {
227+
'links': {
228+
"related": resource.get(field_name)},
229+
'data': relation_data,
230+
'meta': {
231+
'count': len(relation_data)
232+
}
233+
}})
234+
continue
235+
212236
if isinstance(field, (PrimaryKeyRelatedField, HyperlinkedRelatedField)):
213237
relation_type = get_related_resource_type(field)
214238

0 commit comments

Comments
 (0)