在django-rest框架中将初始查询集限制为分页中的对象

时间:2014-09-08 20:09:40

标签: python django pagination django-rest-framework

我使用ModelViewSet定义django-rest-framework 我需要覆盖默认查询集以在呈现响应之前对queryset对象执行一些处理。

这个过程非常耗时,所以我想只对实际可供消费者使用的对象执行它,因为分页响应,而不是将此过程应用于全部对象并应用分页 AFTER 完成我的处理,我可以注意到(如果我错了,请纠正我)是DRF中的默认行为。


简而言之,我需要的是:

如果默认查询集为1000 objects,但分页限制为25 objects per page,我希望仅将25 objects应用于我的流程。请注意,除了分页之外,没有其他限制来减少最终的对象数量。

有办法做到这一点吗?
在这种情况下,重写默认查询集是个坏主意吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

没有“简单”的方法可以做到这一点。在Django REST框架中,分页以与渲染相同的方法完成。

所以我想最好的方法是定义自己的Viewset并重新声明list方法:

from rest_framework.viewssets import ModelViewSet

class MyModelViewSet(ModelViewSet):

  def list(self, request, *args, **kwargs):
    self.object_list = self.filter_queryset(self.get_queryset())                
    if not self.allow_empty and not self.object_list:                           
      warnings.warn(                                                          
        'The `allow_empty` parameter is due to be deprecated. '             
        'To use `allow_empty=False` style behavior, You should override '   
        '`get_queryset()` and explicitly raise a 404 on empty querysets.',  
        PendingDeprecationWarning
      )              
      class_name = self.__class__.__name__                                    
      error_msg = self.empty_error % {'class_name': class_name}
      raise Http404(error_msg)                                                

    page = self.paginate_queryset(self.object_list)                             


    ## INSERT YOUR CODE HERE


    if page is not None:
      serializer = self.get_pagination_serializer(page)                       
    else:       
      serializer = self.get_serializer(self.object_list, many=True)           

    return Response(serializer.data)