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

如何在Django中实现不查询全表的模型表分页?

Django模型表高效分页(无需拉取全量数据)

当然有,Django本身就提供了原生的高效分页方案,完全不需要获取数据库全量数据,核心是利用数据库的分页语法(如LIMIT/OFFSET)只拉取当前页所需的记录,以下是两种常用实现方式:

1. 使用Django原生Paginator类(推荐)

Paginator会自动处理分页逻辑,生成带分页参数的SQL,仅查询当前页数据,同时还能提供总页数、是否有上下页等辅助信息。

示例代码:

from django.core.paginator import Paginator
from django.http import JsonResponse
from .models import YourModel

def paginated_view(request):
    # 获取请求的页码,默认第1页
    page = request.GET.get('page', 1)
    # 构造惰性查询集(不要转成列表,保持QuerySet状态)
    queryset = YourModel.objects.all().order_by('id')
    # 定义每页显示26条数据(匹配你示例中的分页规则)
    paginator = Paginator(queryset, 26)
    # 获取当前页的记录对象
    current_page = paginator.get_page(page)
    
    # 序列化当前页数据返回
    response_data = [{'id': item.id, ...} for item in current_page]
    return JsonResponse(response_data, safe=False)

说明:

  • Django的QuerySet是惰性求值的,只有在实际遍历数据时才会执行SQL,Paginator会自动给查询集添加LIMIT和OFFSET参数,数据库只会返回当前页的26条记录,不会拉取全量的100条数据。
  • 如果不需要总页数、上下页标记等信息,可以跳过Paginator,直接对QuerySet进行切片。

2. 手动切片QuerySet(极简版)

直接通过QuerySet的切片语法实现分页,这种方式不会查询总记录数,仅获取当前页数据,适合不需要分页元信息的场景。

示例代码:

from django.http import JsonResponse
from .models import YourModel

def simple_paginated_view(request):
    page_num = int(request.GET.get('page', 1))
    per_page = 26
    # 计算起始和结束索引
    start_idx = (page_num - 1) * per_page
    end_idx = start_idx + per_page
    # 切片QuerySet,生成的SQL会自动带上LIMIT和OFFSET
    page_records = YourModel.objects.all().order_by('id')[start_idx:end_idx]
    
    response_data = [{'id': item.id, ...} for item in page_records]
    return JsonResponse(response_data, safe=False)

注意事项:

  • 必须给查询集加上order_by排序(比如按id),否则数据库返回的记录顺序不稳定,分页结果会出现重复或遗漏。
  • 当数据量极大时,OFFSET可能会导致性能下降(因为数据库需要跳过前面大量记录),这种情况可以改用基于游标(如id范围)的分页方式,比如上一页的最大id作为下一页的查询条件:
    # 基于游标分页示例(适合大数据量)
    last_id = request.GET.get('last_id', 0)
    page_records = YourModel.objects.filter(id__gt=last_id).order_by('id')[:26]
    

内容的提问来源于stack exchange,提问作者nepko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 11:55:17