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'
}