Django中的分页概念和实现大型对象的有效方法

Posted

技术标签:

【中文标题】Django中的分页概念和实现大型对象的有效方法【英文标题】:Pagination Concept in Django & efficient way to implement over large objects 【发布时间】:2020-03-15 07:47:18 【问题描述】:

在学习 Django 概念的过程中,我偶然发现了分页概念:https://docs.djangoproject.com/en/2.2/topics/pagination/

我了解分页用于将模型的对象字段呈现为离散页面。

在文档中,作者提供了以下 sn-p :

contact_list = Contacts.objects.all() paginator = Paginator(contact_list, 25)

这基本上是加载模型Contacts的所有对象并将它们放入分页以将每页大小限制为25。

我的问题是:假设我们在 Contacts 模型下有数千个带有大 TextField 的对象,执行 Contacts.objects.all() 将需要一些时间,在这种情况下,实现分页的最佳有效方法是什么? Contacts.objects 而不是全部加载然后传递给 Paginator。

【问题讨论】:

【参考方案1】:

Django Paginator (django.core.paginator.Paginator) 类在查询集上使用一个切片,它作为LIMIT 对数据库的查询运行,因此它不会获取所有实例然后获取子集,而是仅检索使用LIMIT 来自数据库的子集。在偏移的情况下,它使用LIMIT <> OFFSET <>,这样也很有效。

Django 查询集是惰性的,因此当您执行 Contacts.objects.all() 并将其传递给分页器时,它不会被评估 - 稍后当分页器实际尝试对其进行切片以获得所需数量的元素时,它将被评估给定的页面。

【讨论】:

以上是关于Django中的分页概念和实现大型对象的有效方法的主要内容,如果未能解决你的问题,请参考以下文章

django的分页--不全也未实现

Django的分页和中间件

django之快速分页

Django中的分页

django中的分页器

django中的分页