Подтвердить что ты не робот

Переопределение Django REST ViewSet с пользовательским методом и моделью

У меня есть a ModelViewSet в Django REST Framework, который дает мне возможность делать POST и GET через следующий адрес:

api/v1/users

Эти пользователи имеют обратное отношение к таблице комментариев, и я хотел бы иметь доступ к этим комментариям через URL-адрес:

api/v1/users/<username>/comments

Я смог сделать это, установив пользовательский @detail_route, переопределив queryset и и serializer_class, но он работает только для запросов GET. Если я попытаюсь выполнить POST новый комментарий через раздел администрирования REST Framework, я получаю сообщение об ошибке, указывающее, что объект "ListSerializer" не является итерируемым "

Здесь мой код:

class UserViewSet(viewsets.ModelViewSet):
    queryset         = User.objects.all()
    serializer_class = UserFlat
    lookup_field     = 'username'


    @detail_route(methods=['post','get'])
    def comment(self, request, **kwargs):

        user = self.get_object()

        self.queryset         = Comment.objects.filter(recipient=user.id)
        self.serializer_class = CommentFlat

        serializer = CommentFlat(instance=self.queryset, many=True)

        return Response(serializer.data)

Новый комментарий должен содержать следующие параметры:

comment.author, comment.message, comment.recipient

Я могу ввести все эти поля в панели администратора и попытаться создать почтовый запрос, но он не сработает. В идеале мне нужно только заполнить комментарий .message и comment.author, а поле comment.recipient должно быть автопопулировано с user.id, которое получено в URL api/v1/users/<username>/comments

Кто-нибудь знает, почему мой почтовый запрос не завершается, и как я могу автозаполнять это поле?

4b9b3361

Ответ 1

Я понял это. Для тех, кто ищет ответ, решение заключалось в том, чтобы явно определить действия, которые происходят при request.method == 'POST' и передать объект в сериализатор.

    @detail_route(methods=['post','get'])
    def comment(self, request, **kwargs):

        user = self.get_object()

        self.queryset = Comment.objects.filter(recipient=user.id)
        self.serializer_class = CommentFlat

        if request.method == 'POST':

            # request.data is from the POST object. We want to take these
            # values and supplement it with the user.id that defined
            # in our URL parameter
            data = {
                'comment': request.data['comment'],
                'rating': request.data['rating'],
                'author': request.data['author'],
                'recipient': user.id
            }

            serializer = CommentFlat(data=data)

            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_201_CREATED)
            else:
                return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

        # Return GET by default
        else:

            serializer = CommentFlat(instance=self.queryset, many=True)

            return Response(serializer.data)