Django DRF api не возвращает никаких значений

Я пытаюсь создать свой первый api, используя Django rest framework DRF. Вот мой код:

в views.py :

class PostViewSet(viewsets.ModelViewSet):

    # permission_classes = [IsAuthenticated]

    @action(detail=True, methods=['GET'])
    def queryset(self, request, pk=None):
        try:
            queryset = Post.objects.get(post_id=pk)
        except Analysis.DoesNotExist:
            return Response(status=status.HTTP_404_NOT_FOUND)

        if request.method == 'GET':
            serializer = PostSerializer(queryset)
            return Response(serializer.data)

и в urls.py:

router = DefaultRouter()
router.register(r'api/post/<int:pk>/post_analysis/', PostViewSet, basename='app_name')
urlpatterns = router.urls

Однако при этом возникает ошибка, которая

The current path, api/post/698/post_analysis/, didn't match any of these. или Not Found: /api/post/698/post_analysis/

Но когда я изменяю url следующим образом, он возвращает none:

PostView = PostViewSet.as_view({
    'get': 'retrieve'
})

urlpatterns = format_suffix_patterns([
  path('api/post/698/post_analysis/', PostView, name='app_name')
])

результат следующий:

{
    "detail": "Not found."
}

Я заметил, что функция queryset() класса PostViewSet не читается.

Я бы попробовал сначала реализовать пример ModelViewSet из документации DRF и посмотреть, работает ли это. Например:

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    permission_classes = [IsAuthenticated]

Я не эксперт DRF, но ваш код выглядит совсем не так, как в примере. Например, я не уверен, почему у вас есть декоратор @action на методе queryset, а также, если вы используете queryset явно, то я думаю, вам нужно использовать методы менеджера .all() или .filter(), которые генерируют наборы queryset, а не .get(), который возвращает один объект. Но если вы правильно определили класс Serializer, то я полагаю, что кверисет берется из модели, которую вы использовали для определения PostSerializer. т.е.:

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post

Попробуйте изменить ваш файл urls.py следующим образом:

router = routers.DefaultRouter()
urlpatterns = [
    path('api/post/<int:pk>/post_analysis/', include(router.urls)),   

]

Возможно, проблема в настройке урлов

Я смог решить проблему с помощью обоих предоставленных ответов следующим образом:

в views.py:

class PostViewSet(viewsets.ModelViewSet):
    
    serializer_class = PostSerializer
    permission_classes = [IsAuthenticated]

    @action(detail=True, methods=['GET'])
    def get_queryset(self, pk=None):
        try:
            pk = self.kwargs['pk']
            queryset = Post.objects.get(post_id=pk)
            return queryset
        except Post.DoesNotExist:
            return Response(status=status.HTTP_404_NOT_FOUND)

и в urls.py:

router = DefaultRouter()
router.register(r'', PostViewSet, basename='app_name')
urlpatterns = [
    path('api/post/<int:pk>/post_analysis/', include(router.urls)),

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