我使用ModelViewSet
定义django-rest-framework
我需要覆盖默认查询集以在呈现响应之前对queryset对象执行一些处理。
这个过程非常耗时,所以我想只对实际可供消费者使用的对象执行它,因为分页响应,而不是将此过程应用于全部对象并应用分页 AFTER 完成我的处理,我可以注意到(如果我错了,请纠正我)是DRF中的默认行为。
简而言之,我需要的是:
如果默认查询集为1000 objects
,但分页限制为25 objects per page
,我希望仅将25 objects
应用于我的流程。请注意,除了分页之外,没有其他限制来减少最终的对象数量。
有办法做到这一点吗?
在这种情况下,重写默认查询集是个坏主意吗?
谢谢!
答案 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)