@@ -139,6 +139,29 @@ 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+ (relation .field_name if relation .field_name else parent_serializer .field_name )
155+ )
156+ if hasattr (parent_model_relation , 'related' ):
157+ relation_model = parent_model_relation .related .model
158+ elif hasattr (parent_model_relation , 'field' ):
159+ relation_model = parent_model_relation .field .related .model
160+ else :
161+ raise APIException ('Unable to find related model for relation {relation}' .format (relation = relation ))
162+ return inflection .pluralize (relation_model .__name__ ).lower ()
163+
164+
142165def extract_id_from_url (url ):
143166 http_prefix = url .startswith (('http:' , 'https:' ))
144167 if http_prefix :
@@ -170,7 +193,7 @@ def extract_attributes(fields, resource):
170193 if isinstance (field , (RelatedField , BaseSerializer , ManyRelatedField )):
171194 continue
172195 data .update ({
173- field_name : ( encoding . force_text ( resource [field_name ]) if resource [ field_name ] is not None else None )
196+ field_name : resource [field_name ]
174197 })
175198
176199 return format_keys (data )
@@ -188,8 +211,7 @@ def extract_relationships(fields, resource):
188211 continue
189212
190213 if isinstance (field , (PrimaryKeyRelatedField , HyperlinkedRelatedField )):
191- relation_model = field .queryset .model
192- relation_type = inflection .pluralize (relation_model .__name__ ).lower ()
214+ relation_type = get_related_resource_type (field )
193215
194216 if resource [field_name ] is not None :
195217 if isinstance (field , PrimaryKeyRelatedField ):
@@ -214,16 +236,8 @@ def extract_relationships(fields, resource):
214236 relation_data = list ()
215237
216238 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
225239
226- relation_type = inflection . pluralize ( relation_model . __name__ ). lower ( )
240+ relation_type = get_related_resource_type ( relation )
227241
228242 if isinstance (relation , HyperlinkedRelatedField ):
229243 for link in resource [field_name ]:
0 commit comments