У меня 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"),

Я пытаюсь PUT, PATCH, GET, но получаю ту же ошибку

{
    "detail": "Not found.",
    "status_code": 404
}
0
Fawad Rana 24 Сен 2020 в 23:18

1 ответ

Лучший ответ

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

Вам не нужно искать объект задачи самостоятельно, это то, что делает за вас универсальное представление. также вам не нужно указывать обработчики методов (get, post, т.е.) самостоятельно, они уже созданы, потому что вы используете класс RetrieveUpdateDestroyAPIView. Кроме того, поскольку в поле поиска по умолчанию используется первичный ключ (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. Это почти то же самое, просто сохранив код

0
ahmed osama 24 Сен 2020 в 21:51