1
1
import collections
2
+ import inflection
2
3
import json
3
4
4
5
from rest_framework .fields import MISSING_ERROR_MESSAGE , SerializerMethodField
@@ -123,7 +124,13 @@ def to_internal_value(self, data):
123
124
self .fail ('incorrect_type' , data_type = type (data ).__name__ )
124
125
if not isinstance (data , dict ):
125
126
self .fail ('incorrect_type' , data_type = type (data ).__name__ )
127
+
126
128
expected_relation_type = get_resource_type_from_queryset (self .queryset )
129
+ field_name = inflection .singularize (expected_relation_type )
130
+ serializer_resource_type = self .get_resource_type_from_serializer (field_name )
131
+
132
+ if serializer_resource_type is not None :
133
+ expected_relation_type = serializer_resource_type
127
134
128
135
if 'type' not in data :
129
136
self .fail ('missing_type' )
@@ -142,18 +149,28 @@ def to_representation(self, value):
142
149
else :
143
150
pk = value .pk
144
151
145
- # check to see if this resource has a different resource_name when
146
- # included and use that name
147
- resource_type = None
148
- root = getattr (self .parent , 'parent' , self .parent )
149
152
field_name = self .field_name if self .field_name else self .parent .field_name
153
+
154
+ resource_type = self .get_resource_type_from_serializer (field_name )
155
+ if resource_type is None :
156
+ resource_type = get_resource_type_from_instance (value )
157
+
158
+ return OrderedDict ([('type' , resource_type ), ('id' , str (pk ))])
159
+
160
+ def get_resource_type_from_serializer (self , field_name ):
161
+ """
162
+ Given a field_name, check if the serializer has a
163
+ corresponding included_serializer with a Meta.resource_name property
164
+
165
+ Returns the resource name or None
166
+ """
167
+ root = getattr (self .parent , 'parent' , self .parent ) or self .parent
150
168
if getattr (root , 'included_serializers' , None ) is not None :
151
169
includes = get_included_serializers (root )
152
170
if field_name in includes .keys ():
153
- resource_type = get_resource_type_from_serializer (includes [field_name ])
171
+ return get_resource_type_from_serializer (includes [field_name ])
154
172
155
- resource_type = resource_type if resource_type else get_resource_type_from_instance (value )
156
- return OrderedDict ([('type' , resource_type ), ('id' , str (pk ))])
173
+ return None
157
174
158
175
def get_choices (self , cutoff = None ):
159
176
queryset = self .get_queryset ()
@@ -219,4 +236,4 @@ def to_representation(self, value):
219
236
if isinstance (value , collections .Iterable ):
220
237
base = super (SerializerMethodResourceRelatedField , self )
221
238
return [base .to_representation (x ) for x in value ]
222
- return super (SerializerMethodResourceRelatedField , self ).to_representation (value )
239
+ return super (SerializerMethodResourceRelatedField , self ).to_representation (value )
0 commit comments