Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit c0bce86

Browse files
committed
Improve identification of root serializer
1 parent 1c8d835 commit c0bce86

File tree

1 file changed

+25
-6
lines changed

1 file changed

+25
-6
lines changed

rest_framework_json_api/relations.py

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)