- Notifications
You must be signed in to change notification settings - Fork302
Description
I'm trying to correctly return a links.related view (not links.self) and haven't been able to find a good example. In looking at the example app it appears to have the same problem. Here's a fragment of my urlconf and view definitions:
router=routers.DefaultRouter()router.register(r'courses',views.CourseViewSet)router.register(r'course_terms',views.CourseTermViewSet)urlpatterns= [url(r'^v1/',include(router.urls)),# http://127.0.0.1:8000/v1/courses/f009e671-b615-42c7-b35f-8500d7ef5d24/relationships/course_termsurl(r'^v1/courses/(?P<pk>[^/.]+)/relationships/(?P<related_field>\w+)',views.CourseRelationshipView.as_view(),name='course-relationships'),# http://127.0.0.1:8000/v1/courses/f009e671-b615-42c7-b35f-8500d7ef5d24/course_terms/url(r'^v1/courses/(?P<fk>[^/.]+)/course_terms/',# need fk (course_id) not pk (id)views.CourseTermViewSet.as_view({'get':'list'}),name='course-course_terms'),]
classCourseBaseViewSet(AuthnAuthzMixIn,SortMixin,FilterMixin,viewsets.ModelViewSet):passclassCourseViewSet(CourseBaseViewSet):# API endpoint that allows course to be viewed or edited.queryset=Course.objects.all()serializer_class=CourseSerializerclassCourseTermViewSet(CourseBaseViewSet):# API endpoint that allows CourseTerm to be viewed or edited.queryset=CourseTerm.objects.all()serializer_class=CourseTermSerializer# queryset = queryset.filter(course_id='ec008c20-79a1-4ca7-931a-019d62c219c9')classCourseRelationshipView(AuthnAuthzMixIn,RelationshipView):queryset=Course.objectsself_link_view_name='course-relationships'
A get of a course looks like this:GET http://127.0.0.1:8000/v1/courses/ec008c20-79a1-4ca7-931a-019d62c219c9/
{"data": {"type":"courses","id":"ec008c20-79a1-4ca7-931a-019d62c219c9","attributes": {"school_bulletin_prefix_code":"XCEFK9","suffix_two":"00","subject_area_code":"PSYB","course_number":"00241","course_identifier":"PSYC1138X","course_name":"SOCIAL PSYCHOLOGY-LEC","course_description":"SOCIAL PSYCHOLOGY-LEC","effective_start_date":null,"effective_end_date":null,"last_mod_user_name":"loader","last_mod_date":"2018-03-11" },"relationships": {"course_terms": {"data": [ {"type":"course_terms","id":"3ce01e27-9a68-4970-b48a-e6a83166ca41" } ],"links": {"self":"http://127.0.0.1:8000/v1/courses/ec008c20-79a1-4ca7-931a-019d62c219c9/relationships/course_terms","related":"http://127.0.0.1:8000/v1/courses/ec008c20-79a1-4ca7-931a-019d62c219c9/course_terms/" },"meta": {"count":1 } } },"links": {"self":"http://127.0.0.1:8000/v1/courses/ec008c20-79a1-4ca7-931a-019d62c219c9/" } }}
ButGET http://127.0.0.1:8000/v1/courses/ec008c20-79a1-4ca7-931a-019d62c219c9/course_terms/
returns all the course_terms, not just those withfk=ec008c20-79a1-4ca7-931a-019d62c219c9
because the foreign key is not being applied. (You can see where I tested and withqueryset = queryset.filter(course_id='ec008c20-79a1-4ca7-931a-019d62c219c9')
) so I'm wondering what theright way to do this is.
Am I missing something? I've reproduced this with the example app and it also does it "wrong". I think I need to extend theview
function to check for some kwargs (e.g. fk) and filter the manager.
Thanks in advance for any help.