繁体   English   中英

如何将多个 api 视图分配给 django rest 框架中的单个端点?

[英]How to assign multiple api views to single endpoint in django rest framework?

我有一个名为Article的 model 和一些 api 的视图。 它们被划分用于不同的目的(例如 ArticleUpdateAPI class 用于 UPDATE http 方法,ArticleDeleteAPI 用于 DELETE 方法等)。 在 urls.py 中,它们被分离到不同的端点(aritcle/pk/update、/article/pk/delete 等)。

据我所知,像这样构建端点不是好的做法,所以我想将它们绑定到单个 url 并使用不同的类来处理不同的 http 方法。 这可能吗?如何? 例子如下

文章API.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)

网址.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来简化它。

使用它,您可以使用单个 url 和单个视图执行所有 http 方法操作。

from rest_framework import viewsets


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

网址.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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM