2015-10-27 173 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