python - 怎样优化models.objects.all() ?
PHPz
PHPz 2017-04-18 09:28:19
[Python讨论组]

先看代码
views.py:

def vms(request):
    user = request.user
    servers = List.objects.all()
    return render_to_response(
        'vmserver/all_vms.html', {
            'list': servers,
            'user': user,
        }
    )

template:

{% for vm in list %}
主机名 IP地址 应用名称 CPU 内存 磁盘 操作系统 电源 配置项
{{ vm.list_name }} {{ vm.ip }} {{ vm.app_name }} {{ vm.cpu }} {{ vm.mem }} {{ vm.total_hard_disk }} {{ vm.os }} {{ vm.power_status }} '''

由于我的List表中有2000多条数据,通过datatables插件渲染数据的时候,响应非常慢,需要10秒左右前端才能渲染完成,请问有什么优化的方法,能让速度更快。

PHPz
PHPz

学习是最好的投资!

全部回复(3)
PHP中文网

分页应当在后台完成,因为你在后台取到了所有2000多条数据传给前台,前台在生成页面的时候就要加载这2000多条数据,如果分页在后台完成,每次只传给前台当前页面的,譬如50条数据,页面在渲染的时候自然会变快。

你可以先这么试试,看我说的对不对:

def vms(request):
    user = request.user
    # .all()方法会获取所有数据,这里只取前50个传递给前端
    servers = List.objects.all()[:50]
    return render_to_response(
        'vmserver/all_vms.html', {
            'list': servers,
            'user': user,
        }
    )

上述代码我只加了一个[:50].all()方法依然会获取所有2000条数据,只是传给前端的只有50条,如果这样一来你的前端渲染速度变快了,那证明速度本身和objects.all()无关,只和前端接收的数据量有关。

实际过程中,后台分页比这个稍微复杂些,要是我上面的结论没问题,我再更新吧……

伊谢尔伦

加缓存,加索引,加分页

PHP中文网

如果你用Django Restframework的话,可以使用框架原生提供的分页功能:

Refer: http://www.django-rest-framew...

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号