Django Rest Framework - "detail": "не найдено."

Привет при выполнении этого запроса: groups / 25010a31-fc5b-47c8-9c5c - d740e5743f52/members/4/ - я получаю "деталь": "не найдено"

однако, если вы посмотрите в queryset, я напечатал экземпляр 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)

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

] 

помочь?

1 ответов


во-первых, вам нужно вернуть queryset в get_queryset() метод.

кроме того, вы неправильно определили lookup_url_kwarg as uuid. Он должен воздействовать user_id как этот url kwarg значение используется для выполнения поиска для uuid lookup_field в queryset вернулся из get_queryset() метод.

значение по умолчанию lookup_url_kwarg Если unset такое же значение, как 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() метод, мы просто фильтруем с помощью group а не user_id поскольку это будет выполняться самим DRF всякий раз, когда есть retrieve запрос.

используя .get() на queryset будет возвращать объект, а не queryset. Для выполнения фильтрации на основе значения lookup_field, нам нужен запрос. Теперь,.filter() возвращает queryset, поэтому мы использовали его здесь.

Примечание: когда вы вернулись GroupMember.objects.filter(group = group, user_id = user_id), в retrieve попытался выполнить поиск по этому возвращенному queryset на user_id поле со значением lookup_url_kwarg значение, т. е. user_id=25010a31-fc5b-47c8-9c5c-d740e5743f52. Поскольку такой объект не существует в этом queryset, он вернул эту ошибку.