You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 06:25:27