- Notifications
You must be signed in to change notification settings - Fork302
Closed
Labels
Description
@Anton-Shutik Using your new#451 support for related links, using{'get': 'retrieve_related'}
works fine for a serializerResourceRelatedField
wheremany=True
but fails for a toOne relationship wheremany=False
.
Using the old style, I had to overrideget_queryset()
formany=True
views andget_object()
formany=False
views so I expect there is a similar need for another "flavor" ofretrieve_related
for toOne relationships. Does this make sense?
Here's my old view code for reference:
classCourseTermViewSet(CourseBaseViewSet):queryset=CourseTerm.objects.all()serializer_class=CourseTermSerializerdefget_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)ifcourse_pkisnotNone:returnself.queryset.filter(course_id=course_pk)returnsuper(CourseTermViewSet,self).get_queryset()
classCourseViewSet(CourseBaseViewSet):queryset=Course.objects.all()serializer_class=CourseSerializerdefget_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)ifcourse_term_pkisnotNone:returnCourseTerm.objects.get(id=course_term_pk).coursereturnsuper(CourseViewSet,self).get_object()
The new code (eliminates those overrides, sets the kwarg topk
and updates therelated_link_view_name
s tocourse-related
andcourse_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).dataFile "/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)