Skip to content

Commit ab0d6ae

Browse files
committed
DRY fix: Created get_related_resource_type()
1 parent 14a303a commit ab0d6ae

File tree

1 file changed

+20
-11
lines changed

1 file changed

+20
-11
lines changed

rest_framework_json_api/utils.py

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,24 @@ def build_json_resource_obj(fields, resource, resource_name):
139139
return OrderedDict(resource_data)
140140

141141

142+
def get_related_resource_type(relation):
143+
queryset = relation.queryset
144+
if queryset is not None:
145+
relation_model = queryset.model
146+
else:
147+
parent_serializer = relation.parent
148+
if hasattr(parent_serializer, 'Meta'):
149+
parent_model = parent_serializer.Meta.model
150+
else:
151+
parent_model = parent_serializer.parent.Meta.model
152+
parent_model_relation = getattr(
153+
parent_model,
154+
(parent_serializer.field_name if parent_serializer.field_name else relation.field_name)
155+
)
156+
relation_model = parent_model_relation.related.model
157+
return inflection.pluralize(relation_model.__name__).lower()
158+
159+
142160
def extract_id_from_url(url):
143161
http_prefix = url.startswith(('http:', 'https:'))
144162
if http_prefix:
@@ -188,8 +206,7 @@ def extract_relationships(fields, resource):
188206
continue
189207

190208
if isinstance(field, (PrimaryKeyRelatedField, HyperlinkedRelatedField)):
191-
relation_model = field.queryset.model
192-
relation_type = inflection.pluralize(relation_model.__name__).lower()
209+
relation_type = get_related_resource_type(field)
193210

194211
if resource[field_name] is not None:
195212
if isinstance(field, PrimaryKeyRelatedField):
@@ -214,16 +231,8 @@ def extract_relationships(fields, resource):
214231
relation_data = list()
215232

216233
relation = field.child_relation
217-
queryset = relation.queryset
218-
if queryset is not None:
219-
relation_model = queryset.model
220-
else:
221-
parent_serializer = field.parent
222-
parent_model = parent_serializer.Meta.model
223-
parent_model_relation = getattr(parent_model, field_name)
224-
relation_model = parent_model_relation.related.model
225234

226-
relation_type = inflection.pluralize(relation_model.__name__).lower()
235+
relation_type = get_related_resource_type(relation)
227236

228237
if isinstance(relation, HyperlinkedRelatedField):
229238
for link in resource[field_name]:

0 commit comments

Comments
 (0)