Как использовать операцию PUT без ID в url с помощью django

Я пытался реализовать метод PUT без ID, хотя это не соответствует принципу REST. Однако мне просто интересно, можно ли это сделать, потому что я могу легко получить экземпляр User из self.request.user. Итак, если я сделаю представление

class ProfileViewSet(mixins.ListModelMixin,
                     mixins.UpdateModelMixin,
                     viewsets.GenericViewSet):
    serializer_class = UserProfileSerializer
    permission_classes = [IsAuthenticated]
    queryset = User.objects.all()
    lookup_field = 'username'

    def get_object(self):
        try:
            return User.objects.get(pk=self.request.user.id)
        except User.DoesNotExist:
            raise NotFound()

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

К сожалению, я не смог достичь функции обновления, так как она всегда выбрасывает исключение, говорящее "Метод PUT не разрешен".

Заранее спасибо.

Настаиваете ли вы на выполнении update на том же url, что и list и create? (похоже, именно это вы и пытаетесь сделать)

Если нет, вы можете зарегистрировать другое действие, которое выполнит обновление так, как вы хотите:

#  will be accessible on <list view url>/update/
@action(methods=["PUT"], detail=False, url_path="update")
def update_current_user(self, request):
    ...

Выполнение этого на том же url также возможно, но потребует еще некоторой гимнастики. Как минимум, вам нужно будет обновить связку между методами запроса и методами представления. Один из способов сделать это описан здесь в документации. Вам также может понадобиться удалить UpdateModelMixin.

Вернуться на верх