python - 怎样优化models.objects.all() ?
PHPz
PHPz 2017-04-18 09:28:19
0
3
396

先看代码
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:

<p class="dataTable_wrapper">
   <table class="table table-striped table-bordered table-hover" id="dataTables-example" width="100%">
    <thead>
    <tr>
        <th>主机名</th>
        <th>IP地址</th>
        <th>应用名称</th>
        <th>CPU</th>
        <th>内存</th>
        <th>磁盘</th>
        <th>操作系统</th>
        <th>电源</th>
        <th>配置项</th>
    </tr>
    </thead>
    <tbody>
    {% for vm in list %}
        <tr class="odd gradeX">
        <td><a href="/vmserver/vms/{{ vm.id }}/$">{{ vm.list_name }}</a></td>
        <td>{{ vm.ip }}</td>
        <td>{{ vm.app_name }}</td>
        <td>{{ vm.cpu }}</td>
        <td>{{ vm.mem }}</td>
        <td>{{ vm.total_hard_disk }}</td>
        <td>{{ vm.os }}</td>
        <td>{{ vm.power_status }}</td>
        <td>
            '''

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

PHPz
PHPz

学习是最好的投资!

全部回覆(3)
Ty80

分頁應在後台完成,因為你在後台取到了所有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()無關,只跟前端接收的資料量有關。

實際過程中,後台分頁比這個稍微複雜些,要是我上面的結論沒問題,我再更新吧…

伊谢尔伦

加緩存,加索引,加分頁

Ty80

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

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

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板