Skip to content

retrieve_related fails for toOne relationship #489

Closed
@n2ygk

Description

@n2ygk

@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)

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions