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, он вернул эту ошибку.