@@ -127,7 +127,7 @@ def to_internal_value(self, data):
127
127
128
128
expected_relation_type = get_resource_type_from_queryset (self .queryset )
129
129
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 )
131
131
132
132
if serializer_resource_type is not None :
133
133
expected_relation_type = serializer_resource_type
@@ -151,27 +151,46 @@ def to_representation(self, value):
151
151
152
152
field_name = self .field_name if self .field_name else self .parent .field_name
153
153
154
- resource_type = self .get_resource_type_from_serializer (field_name )
154
+ resource_type = self .get_resource_type_from_included_serializer (field_name )
155
155
if resource_type is None :
156
156
resource_type = get_resource_type_from_instance (value )
157
157
158
158
return OrderedDict ([('type' , resource_type ), ('id' , str (pk ))])
159
159
160
- def get_resource_type_from_serializer (self , field_name ):
160
+ def get_resource_type_from_included_serializer (self , field_name ):
161
161
"""
162
162
Given a field_name, check if the serializer has a
163
163
corresponding included_serializer with a Meta.resource_name property
164
164
165
165
Returns the resource name or None
166
166
"""
167
167
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
+ ]
169
176
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 ])
172
180
173
181
return None
174
182
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
+
175
194
def get_choices (self , cutoff = None ):
176
195
queryset = self .get_queryset ()
177
196
if queryset is None :
0 commit comments