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中的分页概念和实现大型对象的有效方法的主要内容,如果未能解决你的问题,请参考以下文章