Общие представления Django не работают для PUT, GET, UPDATE, PATCH

#django #django-rest-framework

#django #django-rest-framework

Вопрос:

У меня RetrieveUpdateDestroyAPIView такой вид.

 class TaskRetrieveUpdateDestroyAPIView(RetrieveUpdateDestroyAPIView):
    lookup_field = 'id'
    serializer_class = TasksSerializer

    def get_queryset(self):
        query_set=Task.objects.get(id=self.kwargs['id'])

    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)

    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

    def patch(self, request, *args, **kwargs):
        return self.partial_update(request, *args, **kwargs)

    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)
  

и мои URL-адреса, подобные этому

  path('task_detail/<int:id>', TaskRetrieveUpdateDestroyAPIView.as_view(), name="get_task"),
  

Я пытаюсь ВСТАВИТЬ, ИСПРАВИТЬ, ПОЛУЧИТЬ, но получаю ту же ошибку

 {
    "detail": "Not found.",
    "status_code": 404
}
  

Комментарии:

1. Приведите примеры запросов, которые вы делаете

Ответ №1:

Проблема в функции get_queryset , она ожидает набор запросов, но ваш возвращает один объект, вот что get делает функция, как описано здесь . Итак, вам нужно либо установить поле queryset класса, либо использовать get_queryset функцию.

Вам не нужно самостоятельно искать объект задачи, это то, что общее представление делает для вас. также вам не нужно указывать обработчики методов ( get , post , т. Е.) Самостоятельно, они уже сгенерированы, потому что вы используете RetrieveUpdateDestroyAPIView class . Кроме того, поскольку в поле поиска по умолчанию используется первичный ключ (id), это тоже можно опустить

Попробуйте этот код

 class TaskRetrieveUpdateDestroyAPIView(RetrieveUpdateDestroyAPIView):
    queryset = Task.objects.all()
    serializer_class = TasksSerializer
  

и использовать pk вместо id

  path('task_detail/<int:pk>', TaskRetrieveUpdateDestroyAPIView.as_view(), name="get_task")
  

или вы можете оставить поле поиска как id и использовать его в path функции. Это почти то же самое, просто сохранение некоторого кода