Как назначить несколько api представлений одной конечной точке в django rest framework?

У меня есть модель Article и несколько api представлений для нее. Они разделены для различных целей (например, класс ArticleUpdateAPI для http метода UPDATE, ArticleDeleteAPI для метода DELETE и т.д.). В urls.py они разделены на различные конечные точки (aritcle/pk/update, /article/pk/delete и т.д.).

Как я знаю, это нехорошая практика создавать такие конечные точки, поэтому я хочу привязать их к одному url и использовать разные классы для обработки разных http методов. Возможно ли это и как? Примеры ниже

ArticleAPI.py

class ArticlePostAPI(generics.CreateAPIView):
    serializer_class = ArticleSerializer
    permission_classes = [
        permissions.IsAuthenticatedOrReadOnly
    ]

    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response({
            "comment": CommentSerializer.data
        }, status=201)


class ArticleRetrieveAPI(generics.RetrieveAPIView):
    serializer_class = ArticleSerializer
    queryset = Article.objects.all()
    permission_classes = [
        permissions.AllowAny
    ]


class ArticleListAPI(generics.ListAPIView):
    serializer_class = ArticleSerializer
    queryset = Article.objects.order_by('number', 'headline')
    permission_classes = [
        permissions.AllowAny
    ]


class ArticleUpdateAPI(generics.UpdateAPIView):
    serializer_class = ArticleSerializer
    queryset = Article.objects.all()
    permission_classes = [
        permissions.IsAuthenticated
    ]

    lookup_field = 'pk'

    def update(self, request, *args, **kwargs):
        instance = self.get_object()

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

        serializer = self.get_serializer(instance, data=request.data, partial=True)
        serializer.is_valid(raise_exception=True)
        self.perform_update(serializer)

        return Response(serializer.data)

urls.py

urlpatterns = [
    ...

    # Article API

    path('article/post/', ArticlePostAPI.as_view(), name='article_creation'),
    path('article/<int:pk>/', ArticleRetrieveAPI.as_view(), name='article_retrieve'),
    path('article/', ArticleListAPI.as_view(), name='article_list'),
    path('article/<int:pk>/update/', ArticleUpdateAPI.as_view(), name='article_update'),
]

Используйте ModelViewSet для упрощения.

С его помощью вы можете выполнять все действия метода http с помощью одного url и одного представления.

from rest_framework import viewsets


class ArticleView(viewsets.ModelViewSet):
    serializer_class = ArticleSerializer
    queryset = Article.objects.all()
    permission_classes = [permissions.AllowAny]

urls.py

router = DefaultRouter()
router.register(r'articles', views.ArticleView, basename='articles')

здесь

GET - /articles/ - gives list of all articles
GET - /articles/id/ - gives one object
POST - /articles/ - creates an article
PUT - /articles/id/ - updates an article
PATCH - /articles/id/ - partially updates an article
DELETE - /articles/id/ - deletes an article
Вернуться на верх