2015-10-27 38 views
7

Hi quando si fa questa richiesta: gruppi/25010a31-fc5b-47c8-9c5c-d740e5743f52/soci/4/- ottengo "dettaglio": "Non trovato"Django Rest Framework - "detail": "Not found".

Tuttavia, se si guarda nel set di query ho stampati l'istanza Groupmember e questo finisce per stampare quell'istanza particolare così chiaramente esiste?

Vista:

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) 

gli URL:

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

] 

di aiuto?

+1

C'è una cosa che vedo subito: il tuo 'get_queryset' restituisce un singolo oggetto invece di un queryset. Penso che tu abbia inteso 'filter' invece di' get'. – Ivan

+0

@Ivan 'Filtro' risultati con lo stesso problema – Danny

+1

Si prega di inviare i tuoi url. –

risposta

6

In primo luogo, è necessario restituire un set di query nel metodo get_queryset().

Inoltre, si è erroneamente definito lookup_url_kwarg come uuid. Deve essere infatti user_id poiché questo valore url kwarg viene utilizzato per eseguire la ricerca di uuidlookup_field nel set di query restituito dal metodo get_queryset().

Il valore predefinito per lookup_url_kwarg se disinserito è lo stesso valore di lookup_field. Quindi, non abbiamo bisogno di definire lookup_url_kwarg pari. Sarà calcolato da 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 

Nel metodo get_queryset(), abbiamo appena filtro utilizzando il group e non da user_id come sarà eseguita da DRF sé ogni qualvolta v'è una richiesta retrieve.

L'utilizzo di .get() su un queryset restituirà un oggetto e non un set di query. Per eseguire il filtraggio in base al valore di lookup_field, è necessario un set di query. Ora, .filter() restituisce un set di query, quindi l'abbiamo usato qui.

Nota: Quando si ritorna GroupMember.objects.filter(group = group, user_id = user_id), il retrieve cercato di svolgere ricerca su questo restituito queryset sul campo user_id con il suo valore come lookup_url_kwarg valore cioè user_id=25010a31-fc5b-47c8-9c5c-d740e5743f52. Poiché nessun oggetto di questo tipo esiste in quel queryset, ha restituito quell'errore.

+0

@RagulGupta Grazie, ha funzionato - potresti spiegare perché il suo '.filter' invece di' .get' – Danny

+0

@Danny ha aggiornato gli ans. –

+0

@RagulGupta Lo apprezzo! – Danny