Django Rest Framework - "подробно": "Не найдено".

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

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

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

] 

Любая помощь?

Ответ 1

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

Кроме того, вы неправильно определили lookup_url_kwarg как uuid. Он должен иметь значение user_id, так как это значение url kwarg используется для выполнения поиска uuid lookup_field в наборе запросов, возвращаемом методом 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() в запросе возвращает объект, а не набор запросов. Чтобы выполнить фильтрацию на основе значения lookup_field, нам нужен запрос. Теперь .filter() возвращает запрос, поэтому мы использовали это здесь.

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

Ответ 2

Просто хотел добавить. В случае, если я смотрел на queryset не возвращающая QuerySet с ожидаемым объектом, так и в плане того, что изменения будут выглядеть на ваш вопрос:

class MemberDetail(generics.GenericAPIView):
    serializer_class = GroupMembersSerializer
    queryset = GroupMember.objects.filter(...)

изменился на:

queryset = GroupMember.objects.all()

Ответ 3

обычно эта ошибка появляется при установке таблиц данных Django rest Framework, пожалуйста, проверьте следующие значения в конфигурации Rest Framework в ваших настройках:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ),
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
        'rest_framework_datatables.renderers.DatatablesRenderer',
    ),
    'DEFAULT_FILTER_BACKENDS': (
        'rest_framework_datatables.filters.DatatablesFilterBackend',
    ),
    'DEFAULT_PAGINATION_CLASS': 'rest_framework_datatables.pagination.DatatablesPageNumberPagination',
    'PAGE_SIZE': 50,
    'EXCEPTION_HANDLER': 'utils.rest_framework.views.exception_handler'
}