【问题标题】:Two endpoints for the same resource in django rest frameworkdjango rest框架中同一资源的两个端点
【发布时间】:2017-04-29 00:09:41
【问题描述】:

我想创建两个端点 /comments//comments/requests/ 或类似的东西。第一个显示您的 cmets,第二个显示您的待处理 cmets(人们发送给您的评论,您需要批准)。它们都使用 cmets 模型。我如何在 Django Rest Framework 中实现这一点?

现在,我的看法是

class CommentsListview(APIView):
    serializer_class = CommentSerializer
    def get(self, request, format=None):
        comments, _, _, = Comments.get_comment_users(request.user)
        comments_serializer = CommentSerializer(comments, many=True)
        return Response({'comments': comments_serializer.data})

    def requests(sel,f request, format=None):
        _, requests, _ = Comments.get_comment_users(request.user)
        requests_serializer = CommentSerializer(requests, many=True)
        return Response({'requests': requests_serializer.data})

我想允许用户转到 localhost:8000/comments/ 查看他们的 cmets 和 localhost:8000/comments/requests/ 查看他们待处理的评论请求。由于我无法弄清楚这一点,唯一的其他解决方案是要求用户使用参数作为标志 /comments/?requests=True 来切换端点的行为,但这似乎很草率。

【问题讨论】:

  • 只用稍微不同的查询创建一个新视图?

标签: python django rest django-rest-framework endpoints


【解决方案1】:

使用 list_route 装饰器和 genericviewset

from rest_framework import viewsets
from rest_framework.decorators import list_route

class CommentsListview(viewsets.GenericViewSet):
    serializer_class = CommentSerializer

    def list(self, request, format=None):
        comments, _, _, = Comments.get_comment_users(request.user)
        comments_serializer = CommentSerializer(comments, many=True)
        return Response({'comments': comments_serializer.data})

    @list_route()
    def requests(sel,f request, format=None):
        _, requests, _ = Comments.get_comment_users(request.user)
        requests_serializer = CommentSerializer(requests, many=True)
        return Response({'requests': requests_serializer.data})
  • /comments/ 将调用 list 方法
  • /comments/requests/ 将调用 requests 方法

还可以查看 GenericViewsViewSet 文档,这可能会有所帮助

【讨论】:

  • 太棒了,谢谢。这完美无缺。此外,需要更改urls.py 而不是使用CommentsListview.as_view,您需要使用CommentsListview.as_view({'get': 'list'})CommentsListview.as_view({'get': 'request'})
  • 请查看router 文档,使用视图集可以更简单地使用 DRF 路由器
猜你喜欢
  • 2014-03-17
  • 1970-01-01
  • 2015-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-02
相关资源
最近更新 更多