Skip to content

Commit 430cd3e

Browse files
committed
Use DRF code to fetch related instance
1 parent b207f99 commit 430cd3e

File tree

1 file changed

+10
-22
lines changed

1 file changed

+10
-22
lines changed

rest_framework_json_api/renderers.py

+10-22
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
from django.db.models import Manager
99
from django.utils import encoding, six
1010
from rest_framework import relations, renderers
11+
from rest_framework.fields import SkipField, get_attribute
12+
from rest_framework.relations import PKOnlyObject
1113
from rest_framework.serializers import BaseSerializer, ListSerializer, Serializer
1214
from rest_framework.settings import api_settings
1315

@@ -301,30 +303,16 @@ def extract_relation_instance(cls, field_name, field, resource_instance, seriali
301303
"""
302304
Determines what instance represents given relation and extracts it.
303305
304-
Relation instance is determined by given field_name or source configured on
305-
field. As fallback is a serializer method called with name of field's source.
306+
Relation instance is determined exactly same way as it determined
307+
in parent serializer
306308
"""
307-
relation_instance = None
308-
309309
try:
310-
relation_instance = getattr(resource_instance, field_name)
311-
except AttributeError:
312-
try:
313-
# For ManyRelatedFields if `related_name` is not set
314-
# we need to access `foo_set` from `source`
315-
relation_instance = getattr(resource_instance, field.child_relation.source)
316-
except AttributeError:
317-
if hasattr(serializer, field.source):
318-
serializer_method = getattr(serializer, field.source)
319-
relation_instance = serializer_method(resource_instance)
320-
else:
321-
# case when source is a simple remap on resource_instance
322-
try:
323-
relation_instance = getattr(resource_instance, field.source)
324-
except AttributeError:
325-
pass
326-
327-
return relation_instance
310+
res = field.get_attribute(resource_instance)
311+
if isinstance(res, PKOnlyObject):
312+
return get_attribute(resource_instance, field.source_attrs)
313+
return res
314+
except SkipField:
315+
return None
328316

329317
@classmethod
330318
def extract_included(cls, fields, resource, resource_instance, included_resources,

0 commit comments

Comments
 (0)