Hi when doing this request: groups/25010a31-fc5b-47c8-9c5c-d740e5743f52/members/4/ - I get "detail": "Not found"
However, if you look in the queryset I have printed the Groupmember instance and this ends up printing out that particular instance so clearly it exists?
View:
class MemberDetail(mixins.RetrieveModelMixin,
mixins.DestroyModelMixin,
mixins.UpdateModelMixin,
generics.GenericAPIView):
serializer_class = GroupMembersSerializer
lookup_field = "user_id"
lookup_url_kwarg = "uuid"
def get_queryset(self):
group = self.kwargs["uuid"]
user_id = self.kwargs["user_id"]
print GroupMember.objects.get(group = group, user_id = user_id)
return GroupMember.objects.get(group = group, user_id = user_id)
def get(self, request, *args, **kwargs):
return self.retrieve(self, request, *args, **kwargs)
def put(self, request, *args, **kwargs):
return self.update(self, request, *args, **kwargs)
def delete(self, request, *args, **kwargs):
return self.destroy(self, request, *args, **kwargs)
urls:
urlpatterns = [
url(r'^$', views.GroupList.as_view()),
url(r'^(?P<uuid>[^/]+)/$', views.GroupDetail.as_view()),
url(r'^(?P<uuid>[^/]+)/members/$', views.MemberList.as_view()),
url(r'^(?P<uuid>[^/]+)/members/(?P<user_id>[0-9]+)/$', views.MemberDetail.as_view()),
]
Any help?
Firstly, you need to return a queryset in get_queryset()
method.
Also, you have incorrectly defined lookup_url_kwarg
as uuid
. It should infact be user_id
as this url kwarg
value is used to perform lookup for uuid
lookup_field
in the queryset returned from the get_queryset()
method.
The default value for lookup_url_kwarg
if unset is the same value as lookup_field
. So, we don't need to define lookup_url_kwarg
even. It will be computed from lookup_field
.
class MemberDetail(mixins.RetrieveModelMixin,
mixins.DestroyModelMixin,
mixins.UpdateModelMixin,
generics.GenericAPIView):
serializer_class = GroupMembersSerializer
lookup_field = "user_id" # no need to define 'lookup_url_kwarg' as both have same value
def get_queryset(self):
group = self.kwargs["uuid"]
return GroupMember.objects.filter(group = group) # return a queryset
In the get_queryset()
method, we just filter using the group
and not by user_id
as this will be performed by DRF itself whenever there is a retrieve
request.
Using .get()
on a queryset will return an object and not a queryset. To perform filtering based on the value of lookup_field
, we need a queryset. Now, .filter()
returns a queryset so we used that here.
Note: When you returned GroupMember.objects.filter(group = group, user_id = user_id)
, the retrieve
tried to perform lookup on this returned queryset on the user_id
field with its value as lookup_url_kwarg
value i.e. user_id=25010a31-fc5b-47c8-9c5c-d740e5743f52
. Since no such object exists in that queryset, it returned that error.