Django的REST框架,为list_route行动

Django的REST框架,为list_route行动

问题描述:

定制PAGE_SIZE我有一个list_route:Django的REST框架,为list_route行动

@list_route(methods=['get']) 
    def bought(self, request): 
     bought_photos = Photo.objects.filter(is_bought=True) 

     page = self.paginate_queryset(bought_photos) 
     if page is not None: 
      serializer = self.get_serializer(page, many=True) 
      return self.get_paginated_response(serializer.data) 
     serializer = self.get_serializer(bought_photos, many=True) 
     return Response(serializer.data) 

我如何可以设置自定义PAGE_SIZE只为list_route,而不是它的ModelViewSet?

SOLUTION

1)创建CustomPagination类

from rest_framework.pagination import PageNumberPagination 

class CustomPagination(PageNumberPagination): 
    page_size = 10000 
    page_size_query_param = 'page_size' 

2)编辑list_route代码:

@list_route(methods=['get']) 
    def bought(self, request): 
     bought_photos = Photo.objects.filter(is_bought=True) 
     paginator = CustomPagination() 

     page = paginator.paginate_queryset(bought_photos, request) 
     if page is not None: 
      serializer = self.get_serializer(page, many=True) 
      return paginator.get_paginated_response(serializer.data) 
     serializer = self.get_serializer(bought_photos, many=True) 
     return Response(serializer.data) 

我认为下面的代码应该足够:

@list_route(methods=['get'], pagination_class=CustomPagination) 
def bought(self, request): 
    bought_photos = Photo.objects.filter(is_bought=True) 

    page = self.paginate_queryset(bought_photos) 
    if page is not None: 
     serializer = self.get_serializer(page, many=True) 
     return self.get_paginated_response(serializer.data) 
    serializer = self.get_serializer(bought_photos, many=True) 
    return Response(serializer.data) 
+0

不错!谢谢!你在哪里阅读这是可能的? – user1518217

+0

这是一个非常简短的提及在[文档](http://www.django-rest-framework.org/api-guide/viewsets/#marking-extra-actions-for-routing)“装饰可以额外采取额外只有路由视图才会设置参数,例如......“ – Linovia

+0

我很惊讶地看到关于一些非常高级主题和某种隐藏功能的框架的优秀答案。这个答案一直没有兑现是一个耻辱。只有一点意见:'page'应该是'list'类型,所以它不能是'None',所以它总是会进入if子句。如果列表为空,那么它不应该输入if-子句,因此条件最好是'if page:'。或者也许我有什么问题? – cezar