Skip to content

Commit b74c4e0

Browse files
committed
Getting rid of get_related_resource_type for relations.ResourceRelatedField and utils.extract_relationships
1 parent 0fc8bb0 commit b74c4e0

File tree

2 files changed

+27
-10
lines changed

2 files changed

+27
-10
lines changed

rest_framework_json_api/relations.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from rest_framework.exceptions import ValidationError
22
from rest_framework.relations import *
3-
from rest_framework_json_api.utils import format_relation_name, get_related_resource_type
3+
from rest_framework_json_api.utils import format_relation_name, get_related_resource_type, \
4+
get_resource_type_from_queryset, get_resource_type_from_instance
45
from django.utils.translation import ugettext_lazy as _
56

67

@@ -47,14 +48,14 @@ class ResourceRelatedField(PrimaryKeyRelatedField):
4748
}
4849

4950
def to_internal_value(self, data):
50-
expected_relation_type = format_relation_name(get_related_resource_type(self))
51+
expected_relation_type = get_resource_type_from_queryset(self.queryset)
5152
if data['type'] != expected_relation_type:
5253
self.fail('incorrect_relation_type', relation_type=expected_relation_type, received_type=data['type'])
5354
return super(ResourceRelatedField, self).to_internal_value(data['id'])
5455

5556
def to_representation(self, value):
5657
return {
57-
'type': format_relation_name(get_related_resource_type(self)),
58+
'type': format_relation_name(get_resource_type_from_instance(value)),
5859
'id': str(value.pk)
5960
}
6061

rest_framework_json_api/utils.py

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -187,14 +187,31 @@ def get_related_resource_type(relation):
187187
if hasattr(parent_model_relation, 'related'):
188188
relation_model = parent_model_relation.related.related_model
189189
elif hasattr(parent_model_relation, 'field'):
190-
relation_model = parent_model_relation.field.related_model
190+
relation_model = parent_model_relation.field.related.model
191191
else:
192192
raise APIException('Unable to find related model for relation {relation}'.format(relation=relation))
193193
return format_relation_name(relation_model.__name__)
194194

195195

196-
def get_model_name_from_queryset(qs):
197-
return qs.model._meta.model_name
196+
def get_instance_or_manager_resource_type(resource_instance_or_manager):
197+
198+
if hasattr(resource_instance_or_manager, 'model'):
199+
return get_resource_type_from_manager(resource_instance_or_manager)
200+
if hasattr(resource_instance_or_manager, '_meta'):
201+
return get_resource_type_from_instance(resource_instance_or_manager)
202+
pass
203+
204+
205+
def get_resource_type_from_queryset(qs):
206+
return format_relation_name(qs.model._meta.model.__name__)
207+
208+
209+
def get_resource_type_from_instance(instance):
210+
return format_relation_name(instance._meta.model.__name__)
211+
212+
213+
def get_resource_type_from_manager(manager):
214+
return format_relation_name(manager.model.__name__)
198215

199216

200217
def extract_attributes(fields, resource):
@@ -235,8 +252,8 @@ def extract_relationships(fields, resource, resource_instance):
235252
if not isinstance(field, (RelatedField, ManyRelatedField, BaseSerializer)):
236253
continue
237254

238-
relation_type = get_related_resource_type(field)
239255
relation_instance_or_manager = getattr(resource_instance, field_name)
256+
relation_type = get_instance_or_manager_resource_type(relation_instance_or_manager)
240257

241258
if isinstance(field, HyperlinkedIdentityField):
242259
# special case for HyperlinkedIdentityField
@@ -280,7 +297,7 @@ def extract_relationships(fields, resource, resource_instance):
280297
if isinstance(field, ManyRelatedField):
281298
relation_data = list()
282299
for related_object in relation_instance_or_manager.all():
283-
related_object_type = get_related_resource_type(related_object)
300+
related_object_type = get_instance_or_manager_resource_type(relation_instance_or_manager)
284301
relation_data.append(OrderedDict([
285302
('type', related_object_type),
286303
('id', encoding.force_text(related_object.pk))
@@ -303,8 +320,7 @@ def extract_relationships(fields, resource, resource_instance):
303320
if isinstance(serializer_data, list):
304321
for position in range(len(serializer_data)):
305322
nested_resource_instance = resource_instance_queryset[position]
306-
nested_resource_instance_type = get_related_resource_type(
307-
nested_resource_instance)
323+
nested_resource_instance_type = get_resource_type_from_instance(nested_resource_instance)
308324
relation_data.append(OrderedDict([
309325
('type', nested_resource_instance_type),
310326
('id', encoding.force_text(nested_resource_instance.pk))

0 commit comments

Comments
 (0)