当查询被填充时,有没有办法在 Django 模板中呈现大型查询集?
Posted
技术标签:
【中文标题】当查询被填充时,有没有办法在 Django 模板中呈现大型查询集?【英文标题】:Is there a way to render large querysets in Django templates as the query is populated? 【发布时间】:2020-10-14 10:53:50 【问题描述】:我有一个相当大的查询集和一个非常慢的服务器。当我渲染我的模板时,我注意到页面只在查询集被填充后渲染。为了提高页面加载的速度,我想也许我的页面可以在过滤查询集时即时渲染查询集,但我不确定在 Django 中是否有这样的实现。我的查询集有超过 1000 个项目,每个项目大约有 20 个属性,我需要在页面上显示所有这些。我尝试使用我的 Handsontable 渲染,但我发现实际运行 queryset 过滤器而不是 handsontable 渲染所花费的时间。
如果有人能帮我指出正确的方向,将不胜感激
【问题讨论】:
如果您不使用任何特殊方法,如 AJAX 调用或 websockets,整个响应将立即发送到客户端。虽然您也可以增量流式传输响应,但它不适用于 html。 【参考方案1】:欢迎来到 Stack Overflow @commish :)
为了弄清楚一些基础知识,当您说“即时”时,您可能会想到类似 youtube 的东西,视频会不断地流式传输给您。
这不是 Django 处理请求和响应的方式。
实际发生的事情是这样的:
-
网页点击url(例如:localhost:8000/list/)
请求被 django 视图函数接收
它调用数据库并等待直到收到所有对象
Django 使用查询集构建 html 响应
Django 发回这个响应
(不完全是这样,只是为了解释而简化了)。
如果您想减少第 3 步和第 4 步所花费的时间,因为您的查询集很大,您最简单的选择是“分页”您的请求。
因此,例如,不要将所有 1000 件商品发回,而是只为第一页发回 100 件商品。然后,当用户单击“加载更多”或转到类似 (localhost:8000/list/?page=2) 之类的 url 时,您会加载下一组 100 个项目,依此类推。
Django 有这方面的文档,详细解释了这个概念:https://docs.djangoproject.com/en/3.0/topics/pagination/
【讨论】:
以上是关于当查询被填充时,有没有办法在 Django 模板中呈现大型查询集?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法将 Django 模型查询集转换为模板中的 json 或 json 字符串?