Метод GET не разрешен в DRF ViewSet при попытке получить один ресурс

Я новый Python и Django. Я создал ViewSet следующим образом:

api/views.py

class UserDetails(ViewSet):
"""
CREATE, SELECT, UPDATE OR DELETE
"""

def retrive(self, request, pk):
    user = self.get_object(pk)
    print(user.query)
    user = TestSerializer(user)
    return Response(user.data)

def list(self, request):
    users = TestTB.objects.all()
    print(users.query)
    serializer = TestSerializer(users, many=True)
    return Response(serializer.data)

def create(self, request):
    serializer = TestSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

def update(self, request, pk):
    user = self.get_object(pk)
    serializer = TestSerializer(user, data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

def destroy(self, request, pk):
    user = self.get_object(pk)
    user.delete()
    return Response(status=status.HTTP_204_NO_CONTENT)

def get_object(self, pk):
    try:
        return TestTB.objects.get(pk=pk)
    except TestTB.DoesNotExist:
        raise Http404

api/urls.py

router = routers.DefaultRouter()
router.register(r'users', UserDetails, base_name='user-details')

urlpatterns = router.urls

Это отлично работает с запросом POST для создания нового ресурса, запросом GET для получения всех ресурсов, запросом PUT для обновления ресурса и запросом DELETE для удаления ресурса. Но как я могу получить один ресурс? Когда я делаю запрос типа http://127.0.0.1:8000/api/users/1/, он показывает ошибку -

{ "detail": "Метод \"GET\" не разрешен." }

Это означает, что метод retrieve() в UserDetails никогда не вызывается. Я знаю, что что-то упускаю, но не могу понять, что.


person Zalak Parikh    schedule 12.09.2017    source источник
comment
Замените "извлечь" на "извлечь", мне кажется, это опечатка   -  person Noshii    schedule 12.09.2017
comment
Добавьте сериализатор и набор запросов и удалите все методы, когда вам не нужно их переопределять :)   -  person Thaian    schedule 12.09.2017
comment
@Noshii Отлично! Это была глупая опечатка. Но чем print(user.query) выдает ошибку. Есть ли другой способ просмотреть, какой запрос запускается?   -  person Zalak Parikh    schedule 12.09.2017
comment
user не является набором запросов.   -  person Sachin    schedule 12.09.2017
comment
@Thaian Это был просто тест. Они понадобятся мне позже, когда мне придется запускать сложные пользовательские запросы.   -  person Zalak Parikh    schedule 12.09.2017
comment
@SachinKukreja Я знаю, что user - это объект. Но я спрашиваю, как просмотреть запрос в этом случае?   -  person Zalak Parikh    schedule 12.09.2017
comment
Используйте django.db.connection для запросов.   -  person Sachin    schedule 12.09.2017
comment
Вы также можете установить панель инструментов отладки Django. Ссылка: Использование django.db.connection   -  person Sachin    schedule 12.09.2017
comment
@Thaian Кстати, добавление набора запросов в ViewSet, который будет извлекать все строки (данные) по каждому запросу, не замедлит обработку, когда размер данных будет огромным?   -  person Zalak Parikh    schedule 12.09.2017
comment
Набор запросов не означает все строки.   -  person Sachin    schedule 12.09.2017
comment
@noshii должен был дать ответ: восстановить -> получить   -  person Linovia    schedule 12.09.2017
comment
@SachinKukreja - Разве @Thaian не говорит о том, чтобы добавить serializer_class = TestSerializer и queryset = TestTB.objects.all() в представление? Чем TestTB.objects.all() получит все строки   -  person Zalak Parikh    schedule 12.09.2017
comment
Нет, не будет. Наборы запросов ленивы и не вызывают базу данных, пока не будут оценены.   -  person Daniel Roseman    schedule 12.09.2017
comment
И добавление набора запросов не означает, что вы должны выполнить .all(). Это также может быть любой отфильтрованный набор запросов.   -  person Sachin    schedule 12.09.2017


Ответы (1)


Измените retrive на retrieve. Сделал ответ из комментария, как предложил @Linovia.

person Noshii    schedule 12.09.2017
comment
Я действительно не вижу причин, по которым это не сработало бы, пропустив эту опечатку, которая предотвращает привязку подробного глагола GET к конкретному действию. - person Linovia; 12.09.2017