当查询被填充时,有没有办法在 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 字符串?

Django 模板:有没有办法根据其属性查询特定对象(而不是遍历所有对象)?

有没有办法用查询字符串填充表单?

ModelForm 的 Django 编辑模板未填充值

Django:当它们已经被覆盖时不能覆盖管理模板?

选择了 django 返回表单选项