- 
                Notifications
    You must be signed in to change notification settings 
- Fork 300
Closed
Labels
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_names 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)