@@ -127,7 +127,7 @@ def to_internal_value(self, data):
127127
128128 expected_relation_type = get_resource_type_from_queryset (self .queryset )
129129 field_name = inflection .singularize (expected_relation_type )
130- serializer_resource_type = self .get_resource_type_from_serializer (field_name )
130+ serializer_resource_type = self .get_resource_type_from_included_serializer (field_name )
131131
132132 if serializer_resource_type is not None :
133133 expected_relation_type = serializer_resource_type
@@ -151,27 +151,46 @@ def to_representation(self, value):
151151
152152 field_name = self .field_name if self .field_name else self .parent .field_name
153153
154- resource_type = self .get_resource_type_from_serializer (field_name )
154+ resource_type = self .get_resource_type_from_included_serializer (field_name )
155155 if resource_type is None :
156156 resource_type = get_resource_type_from_instance (value )
157157
158158 return OrderedDict ([('type' , resource_type ), ('id' , str (pk ))])
159159
160- def get_resource_type_from_serializer (self , field_name ):
160+ def get_resource_type_from_included_serializer (self , field_name ):
161161 """
162162 Given a field_name, check if the serializer has a
163163 corresponding included_serializer with a Meta.resource_name property
164164
165165 Returns the resource name or None
166166 """
167167 root = getattr (self .parent , 'parent' , self .parent ) or self .parent
168- if getattr (root , 'included_serializers' , None ) is not None :
168+ root = self .get_root_serializer ()
169+
170+ if root is not None :
171+ # accept both singular and plural versions of field_name
172+ field_names = [
173+ inflection .singularize (field_name ),
174+ inflection .pluralize (field_name )
175+ ]
169176 includes = get_included_serializers (root )
170- if field_name in includes .keys ():
171- return get_resource_type_from_serializer (includes [field_name ])
177+ for field in field_names :
178+ if field in includes .keys ():
179+ return get_resource_type_from_serializer (includes [field ])
172180
173181 return None
174182
183+ def get_root_serializer (self ):
184+ if hasattr (self .parent , 'parent' ) and self .is_serializer (self .parent .parent ):
185+ return self .parent .parent
186+ elif self .is_serializer (self .parent ):
187+ return self .parent
188+
189+ return None
190+
191+ def is_serializer (self , candidate ):
192+ return hasattr (candidate , 'included_serializers' )
193+
175194 def get_choices (self , cutoff = None ):
176195 queryset = self .get_queryset ()
177196 if queryset is None :
0 commit comments