DjangoRestFramework - 如何在调用ViewSet GET / LIST时仅序列化一定数量的对象?

时间:2015-11-04 02:14:27

标签: django django-rest-framework django-pagination

所以这是我的ViewSet:

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

    def perform_create(self, serializer):
        serializer.save(owner=self.request.user, location=self.request.user.userextended.location)

    @detail_route(methods=['post'], permission_classes=[IsFromLoactionOrReadOnly])
    def like(self, request, pk=None):
        post = self.get_object()
        post.usersVoted.add(request.user)
        return Response(status=status.HTTP_204_NO_CONTENT)

这是我的网址/路由器:

router.register(r'posts', views.PostViewSet)

现在,当我转到此网址时:

/posts

DRF发送所有帖子和序列号(或者我认为..我还没有很多帖子,所以我假设它发送了所有帖子)。我想要做的是我希望能够将我的ViewSet序列化的帖子数限制为10.我要序列化的10个对象取决于我想强制API用户使用URL发送的页码。例如,我想强制用户使用URL发送一个数字,如下所示:

/posts/x

在后端,我想用pk x序列化帖子到x + 9(所以如果我们假设x = 1,那么我想序列化pk = 1,pk = 2,pk = 3的帖子。 .pk = 10。)。这可能与DRF有关吗?我猜测我使用的是Pagination,因为当我阅读文档时,它看起来像我需要的东西,但我无法完全理解分页的确切位置以及我如何使用它实现我想要的。以下是分页的文档:http://www.django-rest-framework.org/api-guide/pagination/

提前致谢。

2 个答案:

答案 0 :(得分:1)

您想要使用Django Rest Framework提供的pagination控件,就像您猜测的那样。

这个snippit可能会帮助你绕过它:

{
    "count": 1023
    "next": "https://api.example.org/accounts/?page=5",
    "previous": "https://api.example.org/accounts/?page=3",
    "results": [
       …
    ]
}

除了正常的'结果之外,它还显示了一个回复。您期望还包括下一个和上一个值。这些是指向端点的链接,可用于返回上一页数据的结果,或下一页的数据。将这些链接映射到适当的用户控件是前端的责任,以便可以进行分页导航。

答案 1 :(得分:1)

你是对的。你需要分页来实现这一目标。只需添加<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div id="first" > <div class="d" > <div class="c"> <div class="e"></div> This is my first div to display image. </div> </div> </div> <div id="second"> </div> <div id="third"> </div>就像你写的pagination_class等一样。另外,创建一个具有数字的类,您希望对其进行分页。

serializer_class

并设置from rest_framework.pagination import PageNumberPagination class StandardResultsSetPagination(PageNumberPagination): page_size = 10 page_size_query_param = 'page_size' max_page_size = 1000