2015-10-27 88 views
7

喜做这个请求时:组/ 25010a31-fc5b-47c8-9c5c-d740e5743f52// 4 /成员 - 我碰到一个“细节”:“未找到”Django Rest Framework - “detail”:“未找到。”

但是,如果你在查询集看我已经印刷Groupmember实例并最终打印出特定的实例,因此它显然存在?

查看:

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) 

网址:

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()), 

] 

任何帮助吗?

+1

有一件事我马上看到:你的'get_queryset'返回的是单个对象而不是查询集。我认为你的意思是'filter'而不是'get'。 – Ivan

+0

@Ivan'过滤器结果与相同的问题 – Danny

+1

请张贴您的网址。 –

回答

6

首先,你需要在get_queryset()方法返回一个查询集。

此外,您错误地定义为lookup_url_kwarguuid。应该INFACT是user_id作为此URL kwarg值被用于为uuidlookup_field执行查找在查询集从get_queryset()方法返回。

lookup_url_kwarg如果取消设置的默认值是相同的值lookup_field。所以,我们甚至不需要定义lookup_url_kwarg。它将从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 

get_queryset()方法中,我们因为这将通过DRF本身每当有一个retrieve请求来执行刚过滤由user_id使用group而不是。

上查询集使用.get()会返回一个对象,而不是一个查询集。要根据lookup_field的值执行过滤,我们需要一个查询集。现在,.filter()返回一个查询集,所以我们在这里使用它。

注:当你返回GroupMember.objects.filter(group = group, user_id = user_id),该retrieve尝试执行查找这个返回查询集的user_id领域,其价值为lookup_url_kwarg值即user_id=25010a31-fc5b-47c8-9c5c-d740e5743f52。由于该查询集中不存在此类对象,因此它返回了该错误。

+0

@RagulGupta谢谢,这工作 - 你能解释为什么它的'.filter'而不是'.get' – Danny

+0

@Danny更新了ans。 –

+0

@RagulGupta我很感激! – Danny