Метод Django Rest Framework \ "GET \" не разрешен Ошибка? - PullRequest
1 голос
/ 02 июня 2019

Я делаю класс CreateApiView, и этот метод внутри класса и ошибка: "detail": "Метод \" GET \ "не разрешен.",

class RetractBidAPIView(ListCreateAPIView):
    permission_classes = (permissions.IsAuthenticated,)
    serializer_class = RetractBidSerializer
    queryset = ''

    def create(self, request, pk, *args, **kwargs):
        auction = get_object_or_404(Auction, pk=pk)
        date_now = datetime.now(timezone.utc)
        serializer = self.get_serializer(data=request.data,
                                      context={"request": request})

        serializer.is_valid(raise_exception=True)
        serializer.save(buyer=request.user, auction=auction)

        bid = get_object_or_404(Bid, pk=current_bid.pk)
        bid.delete()
        return Response(serializer.data, {"detail": "You bid is retracted"}, status=status.HTTP_200_OK)

Ответы [ 2 ]

1 голос
/ 02 июня 2019

Короче говоря : так как вы меняете сущности (ну, вы, кажется, удаляете одну из них здесь), вы действительно не можете вызвать представление с помощью запроса GET.

Предполагается, что GET-запрос имеет никаких побочных эффектов, так что это означает, что сущности остаются одинаковыми (одинаковое количество сущностей и одинаковые значения).

A CreateApiView [drf-doc] , таким образом, реализует:

(...)

Предоставляет post обработчик метода.

Таким образом, вы можете только отправлять POST-запросы к этому представлению, он не разрешает запросы DELETE, GET, PATCH, PUT и т. Д.

Например, вы можете сделать POST-запрос с помощью библиотеки requests или с помощью curl -X POST ... [wiki] .

При этом ваша реализация больше похожа на DestroyApiView [drf-doc] . Это представление обрабатывает запросы DELETE.

0 голосов
/ 04 июня 2019
class RetractBidAPIView(APIView)

permission_classes = (permissions.IsAuthenticated,)

def get(self, request, *args, **kwargs):
    auction = get_object_or_404(Auction, pk=self.kwargs.get(pk)
    date_now = datetime.now(timezone.utc)
    serializer = RetractBidSerializer(data=request.data,
                                  context={"request": request})

    serializer.is_valid(raise_exception=True)
    serializer.save(buyer=request.user, auction=auction)

    bid = get_object_or_404(Bid, pk=current_bid.pk)
    bid.delete()
    return Response(serializer.data, {"detail": "You bid is retracted"}, 
                 status=status.HTTP_200_OK)
...