Django ModelViewSet如何添加过滤前总数据量至分页响应?
解决方案
要实现同时返回过滤前后的数据量,你需要在视图中先计算原始未过滤的数据总量,再在自定义分页类中把这个总量加入响应结果里,具体步骤如下:
1. 修改ModelViewSet视图,计算原始总数据量
在你的XList视图中重写list方法,提前获取未经过滤的查询集并计算总数,存储到视图实例中:
class XList(viewsets.ModelViewSet): serializer_class = serializers.XXX queryset = models.XXX.objects.all() lookup_field = 'field_id' filter_backends = [DjangoFilterBackend] filterset_class = filters.MYOWNFILTER def list(self, request, *args, **kwargs): # 获取未应用过滤器的原始查询集 original_queryset = self.get_queryset() # 计算原始总数据量并存储 self.total_count = original_queryset.count() # 执行父类的列表查询逻辑 return super().list(request, *args, **kwargs)
2. 修改自定义分页类,添加TOTAL_COUNT字段
在你的分页类的get_paginated_response方法中,从视图实例中取出原始总数据量,加入响应字典:
def get_paginated_response(self, data): return Response({ 'next': self.page.next_page_number() if self.page.has_next() else None, 'previous': self.page.previous_page_number() if self.page.has_previous() else None, 'count': self.page.paginator.count, # 过滤后的数据量 'TOTAL_COUNT': self.view.total_count, # 过滤前的原始总数据量 'size': len(data), 'results': data })
说明
count字段保留原有的过滤后数据量,TOTAL_COUNT新增为过滤前的原始总数据量- 如果你的
get_queryset方法有自定义逻辑(比如只返回当前用户的数据),这种方式会自动基于该逻辑计算原始总量,符合业务场景 - 若担心两次
count查询的性能问题,可以考虑给关联字段添加索引,或者使用短期缓存优化原始总量查询
内容的提问来源于stack exchange,提问作者robamemar
相关产品推荐
相关产品推荐

