Skip to content

Commit c864c97

Browse files
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.
1 parent 28833bf commit c864c97

File tree

1 file changed

+11
-12
lines changed

1 file changed

+11
-12
lines changed

rest_framework_json_api/utils.py

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,9 @@ def build_json_resource_obj(fields, resource, resource_instance, resource_name):
164164

165165

166166
def get_related_resource_type(relation):
167-
if hasattr(relation, 'get_queryset') and relation.get_queryset() is not None:
167+
if hasattr(relation, '_meta'):
168+
relation_model = relation._meta.model
169+
elif hasattr(relation, 'get_queryset') and relation.get_queryset() is not None:
168170
relation_model = relation.get_queryset().model
169171
else:
170172
parent_serializer = relation.parent
@@ -266,11 +268,10 @@ def extract_relationships(fields, resource, resource_instance):
266268

267269
if isinstance(field, ManyRelatedField):
268270
relation_data = list()
269-
related_object = field.child_relation
270-
relation_type = get_related_resource_type(related_object)
271271
for related_object in relation_instance_or_manager.all():
272+
related_object_type = get_related_resource_type(related_object)
272273
relation_data.append(OrderedDict([
273-
('type', relation_type),
274+
('type', related_object_type),
274275
('id', encoding.force_text(related_object.pk))
275276
]))
276277
data.update({
@@ -285,20 +286,18 @@ def extract_relationships(fields, resource, resource_instance):
285286

286287
if isinstance(field, ListSerializer):
287288
relation_data = list()
288-
serializer = field.child
289-
relation_model = serializer.Meta.model
290-
relation_type = format_relation_name(relation_model.__name__)
291289

292290
serializer_data = resource.get(field_name)
293291
resource_instance_queryset = relation_instance_or_manager.all()
294292
if isinstance(serializer_data, list):
295293
for position in range(len(serializer_data)):
296294
nested_resource_instance = resource_instance_queryset[position]
297-
relation_data.append(
298-
OrderedDict(
299-
[('type', relation_type), ('id', encoding.force_text(nested_resource_instance.pk))]
300-
)
301-
)
295+
nested_resource_instance_type = get_related_resource_type(
296+
nested_resource_instance)
297+
relation_data.append(OrderedDict([
298+
('type', nested_resource_instance_type),
299+
('id', encoding.force_text(nested_resource_instance.pk))
300+
]))
302301

303302
data.update({field_name: {'data': relation_data}})
304303
continue

0 commit comments

Comments
 (0)