Closed
Description
@Anton-Shutik Using your new #451 support for related links, using{'get': 'retrieve_related'}
works fine for a serializer ResourceRelatedField
where many=True
but fails for a toOne relationship where many=False
.
Using the old style, I had to override get_queryset()
for many=True
views and get_object()
for many=False
views so I expect there is a similar need for another "flavor" of retrieve_related
for toOne relationships. Does this make sense?
Here's my old view code for reference:
class CourseTermViewSet(CourseBaseViewSet):
queryset = CourseTerm.objects.all()
serializer_class = CourseTermSerializer
def get_queryset(self, *args, **kwargs):
"""
Implement `related` view:
Override `.list` if course_pk kwarg is present since course is toMany to course_term.
"""
course_pk = self.kwargs.get('course_pk', None)
if course_pk is not None:
return self.queryset.filter(course_id=course_pk)
return super(CourseTermViewSet, self).get_queryset()
class CourseViewSet(CourseBaseViewSet):
queryset = Course.objects.all()
serializer_class = CourseSerializer
def get_object(self):
"""
Implement `related` view:
Override `.retrieve` if course_term_pk kwarg is present since course_term is toOne to course.
"""
course_term_pk = self.kwargs.get('course_term_pk', None)
if course_term_pk is not None:
return CourseTerm.objects.get(id=course_term_pk).course
return super(CourseViewSet, self).get_object()
The new code (eliminates those overrides, sets the kwarg to pk
and updates the related_link_view_name
s to course-related
and course_term-related
, respectively and throws this error when retrieved:
AttributeError at /v1/course_terms/a1d34785-cc25-4c1c-9806-9d05a98068c7/course/
Got AttributeError when attempting to get a value for field `school_bulletin_prefix_code` on serializer `CourseSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `PKOnlyObject` instance.
Original exception text was: 'PKOnlyObject' object has no attribute 'school_bulletin_prefix_code'.
...
Traceback:
File "/Users/alan/src/django-training/env/lib/python3.6/site-packages/rest_framework/fields.py" in get_attribute
441. return get_attribute(instance, self.source_attrs)
File "/Users/alan/src/django-training/env/lib/python3.6/site-packages/rest_framework/fields.py" in get_attribute
100. instance = getattr(instance, attr)
During handling of the above exception ('PKOnlyObject' object has no attribute 'school_bulletin_prefix_code'), another exception occurred:
File "/Users/alan/src/django-training/env/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
34. response = get_response(request)
File "/Users/alan/src/django-training/env/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
126. response = self.process_exception_by_middleware(e, request)
File "/Users/alan/src/django-training/env/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
124. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/alan/src/django-training/env/lib/python3.6/site-packages/django/views/decorators/csrf.py" in wrapped_view
54. return view_func(*args, **kwargs)
File "/Users/alan/src/django-training/env/lib/python3.6/site-packages/rest_framework/viewsets.py" in view
103. return self.dispatch(request, *args, **kwargs)
File "/Users/alan/src/django-training/env/lib/python3.6/site-packages/rest_framework/views.py" in dispatch
483. response = self.handle_exception(exc)
File "/Users/alan/src/django-training/env/lib/python3.6/site-packages/rest_framework/views.py" in handle_exception
443. self.raise_uncaught_exception(exc)
File "/Users/alan/src/django-training/env/lib/python3.6/site-packages/rest_framework/views.py" in dispatch
480. response = handler(request, *args, **kwargs)
File "/Users/alan/src/django-training/env/lib/python3.6/site-packages/rest_framework_json_api/views.py" in retrieve_related
128. return Response(serializer.data)
File "/Users/alan/src/django-training/env/lib/python3.6/site-packages/rest_framework/serializers.py" in data
560. ret = super(Serializer, self).data
File "/Users/alan/src/django-training/env/lib/python3.6/site-packages/rest_framework/serializers.py" in data
262. self._data = self.to_representation(self.instance)
File "/Users/alan/src/django-training/env/lib/python3.6/site-packages/rest_framework/serializers.py" in to_representation
514. attribute = field.get_attribute(instance)
File "/Users/alan/src/django-training/env/lib/python3.6/site-packages/rest_framework/fields.py" in get_attribute
462. raise type(exc)(msg)