@@ -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
200217def 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