跳转到主要内容

Django的基于游标的分页

项目描述

Django游标分页 构建状态

这是一个为Django设计的基于游标的分页系统。我们不是通过数字引用特定页面,而是给查询集中每个项目分配一个基于其排序值的游标。然后我们通过请求当前最后项目的游标之后的记录来请求后续记录。同样,我们可以请求第一个项目的游标之前的记录,以便通过列表导航回。

与传统分页相比,这种方法有两个主要优点。首先,它确保了当新数据写入表时,记录不会移动到下一页。其次,由于我们不使用非常大的偏移量,查询数据库的速度要快得多。

与“传统”分页相比存在一些显著缺点。数据必须按照一些唯一标识所有记录的数据库字段(多个字段)进行排序。一个典型的用例是按照创建时间戳和ID进行排序。获取数据的可能页码范围也更为困难。

这个项目的灵感主要来自David Cramer的这篇博客这篇博客,以及Relay GraphQL的连接规范。大部分实现灵感来源于Django rest framework的游标分页。与Disqus方法相比,这里的主要区别是我们要求排序必须是完全确定的,而不是使用偏移量。

安装

pip install django-cursor-pagination

用法

from cursor_pagination import CursorPaginator

from myapp.models import Post


def posts_api(request, after=None):
    qs = Post.objects.all()
    page_size = 10
    paginator = CursorPaginator(qs, ordering=('-created', '-id'))
    page = paginator.page(first=page_size, after=after)
    data = {
        'objects': [serialize_page(p) for p in page],
        'has_next_page': page.has_next,
        'last_cursor': paginator.cursor(page[-1])
    }
    return data


async def posts_api_async(request, after=None):
    qs = Post.objects.all()
    page_size = 10
    paginator = CursorPaginator(qs, ordering=('-created', '-id'))
    page = await paginator.apage(first=page_size, after=after)
    data = {
        'objects': [serialize_page(p) for p in page],
        'has_next_page': page.has_next,
        'last_cursor': paginator.cursor(page[-1])
    }
    return data

可以通过使用lastbefore参数来使用paginator.page实现反向分页。

注意事项

  • 指定的排序必须唯一标识对象。
  • 如果提供的游标不指向有效的对象,则has_previous(对于after)或has_next(对于before)的值将始终返回True
  • NULL在带有ORDER BY(无论是ASC还是DESC)的查询结果中位于末尾。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分发

django_cursor_pagination-0.3.0.tar.gz (7.9 kB 查看散列)

上传时间

构建分发

django_cursor_pagination-0.3.0-py3-none-any.whl (6.8 kB 查看散列)

上传时间 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面