#DRF method GET not allowed on action based function

3 messages · Page 1 of 1 (latest)

ebon jay
#

ArticleAPI.py All @action based methods are not work

class ArticleAPI(viewsets.ModelViewSet):
    serializer_class = ArticleSerializer
    permission_classes = [
        permissions.IsAuthenticatedOrReadOnly
    ]
    queryset = Article.objects.order_by('number')
    lookup_field = 'pk'

    ...

    @action(methods=['GET'], detail=True,
            url_path='comments', url_name='article-comments-list')
    def get_comments_queryset(self, request):
        instance = self.get_object()
        serializer = CommentSerializer(queryset=instance.comment_set.all(), many=True)
        return Response(serializer.data)

    @action(methods=['GET'], detail=True,
            url_path='comments', url_name='article-comments-object')
    def get_comment_object(self, request, pk=None):
        instance = self.get_object()
        serializer = CommentSerializer(queryset=instance.comment_set.get(pk=pk))
        return Response(serializer.data)
#
@action(methods=['post'], detail=True,
            url_path='comments', url_name='article-create-comment')
    def create_comment(self, request):
        serializer = CommentSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.create(serializer.data)
        return Response({
            "comment": serializer.data
        }, status=201)

    @action(methods=['patch'], detail=True,
            url_path='comments', url_name='article-update-comment')
    def partial_update_comment(self, request):
        instance = self.get_object()

        if not self.check_self_or_admin(request, instance):
            return Response({
                "errors": "Logged in user and author must be same"
            }, status=403)

        serializer = CommentSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.partial_update(serializer.data)
        return Response({
            "comment": serializer.data
        })

    @action(methods=['delete'], detail=True,
            url_path='comments', url_name='article-update-comment')
    def delete_comment(self, request):
        instance = self.get_object()

        if not self.check_self_or_admin(request, instance):
            return Response({
                "errors": "Logged in user and author must be same"
            }, status=403)

        self.perform_destroy(instance)
        return Response(status=204)
#

urls.py:

router = SimpleRouter()
router.register('articles', articleAPI.ArticleAPI, basename='articles')