Skip to content

Commit a210e63

Browse files
committed
Moved "related_serializers" from view to serializer
1 parent 6e0b47c commit a210e63

File tree

3 files changed

+17
-21
lines changed

3 files changed

+17
-21
lines changed

example/serializers.py

+5
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,11 @@ class AuthorSerializer(serializers.ModelSerializer):
177177
'bio': AuthorBioSerializer,
178178
'type': AuthorTypeSerializer
179179
}
180+
related_serializers = {
181+
'bio': 'example.serializers.AuthorBioSerializer',
182+
'entries': 'example.serializers.EntrySerializer',
183+
'first_entry': 'example.serializers.EntrySerializer'
184+
}
180185

181186
class Meta:
182187
model = Author

example/views.py

-5
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,6 @@ class NonPaginatedEntryViewSet(EntryViewSet):
9595
class AuthorViewSet(ModelViewSet):
9696
queryset = Author.objects.all()
9797
serializer_class = AuthorSerializer
98-
related_serializers = {
99-
'bio': 'example.serializers.AuthorBioSerializer',
100-
'entries': 'example.serializers.EntrySerializer',
101-
'first_entry': 'example.serializers.EntrySerializer'
102-
}
10398

10499

105100
class CommentViewSet(ModelViewSet):

rest_framework_json_api/views.py

+12-16
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,6 @@ class RelatedMixin(object):
105105
"""
106106
This mixin handles all related entities, whose Serializers are declared in "related_serializers"
107107
"""
108-
related_serializers = {}
109-
related_field_mapping = {}
110108

111109
def retrieve_related(self, request, *args, **kwargs):
112110
serializer_kwargs = {}
@@ -133,29 +131,27 @@ def get_serializer_class(self):
133131
if 'related_field' in self.kwargs:
134132
field_name = self.kwargs['related_field']
135133

136-
assert hasattr(parent_serializer_class, 'included_serializers')\
137-
or self.related_serializers,\
138-
'Either "included_serializers" or ' \
139-
'"related_serializers" should be configured'
140-
141134
# Try get the class from related_serializers
142-
class_str = self.related_serializers.get(field_name, None)
143-
144-
if class_str is None:
145-
# Class was not found in related_serializers, look for it in included_serializers
146-
class_str = getattr(self, 'included_serializers', {}).get(field_name, None)
135+
if hasattr(parent_serializer_class, 'related_serializers'):
136+
class_str = parent_serializer_class.related_serializers.get(field_name, None)
137+
if class_str is None:
138+
raise NotFound
147139

140+
elif hasattr(parent_serializer_class, 'included_serializers'):
141+
class_str = parent_serializer_class.included_serializers.get(field_name, None)
148142
if class_str is None:
149143
raise NotFound
144+
145+
else:
146+
assert False, \
147+
'Either "included_serializers" or "related_serializers" should be configured'
148+
150149
return import_class_from_dotted_path(class_str)
151150

152151
return parent_serializer_class
153152

154153
def get_related_field_name(self):
155-
field_name = self.kwargs['related_field']
156-
if field_name in self.related_field_mapping:
157-
return self.related_field_mapping[field_name]
158-
return field_name
154+
return self.kwargs['related_field']
159155

160156
def get_related_instance(self):
161157
parent_obj = self.get_object()

0 commit comments

Comments
 (0)