django分页后过滤数据,要进行补全数据的方法

永不止步 / 2024-02-21 / 原文

项目开发中遇到一个问题: 当分页后还要进行数据处理,可能导致原本分页返回的数据不足,那么需要从另外一页进行数据补全(也要数据进行过滤)。

自己写了一个小的组件:

def data_paging(queryset, page, limit, deal_func=None, *args, **kwargs):
    # 创建分页器对象
    paginator = Paginator(queryset, limit)
    try:
        # 尝试获取当前页码的数据
        res = paginator.page(page)
    except EmptyPage:
        # 如果当前页码超出范围,返回最后一页数据
        res = paginator.page(paginator.num_pages)
    if deal_func:
        res__ = [x for x in res]
        return_data = deal_func(res__, *args, **kwargs)
        # 检查当前页的数据量是否满足每页的数量要求
        while len(return_data) < limit and res.has_next():
            # 尝试获取下一页的数据来补齐当前页
            count = len(return_data)
            next_page = paginator.page(res.next_page_number())
            res.object_list.extend(next_page.object_list[:limit - len(return_data)])
            return_data_ = deal_func([x for x in res[count+1:]],*args, **kwargs)
            return_data.extend(return_data_)
        return return_data
    else:
        res = [x for x in res]
        return res

  上述中:

queryset: 整体查询出来的数据
page:第几页
limit:返回多少条
deal_func:过滤的函数(可以不传)
*args,**kwargs: 过滤函数传参