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

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

学习是最好的投资!

membalas semua(3)
Ty80

Paging harus dilengkapkan di latar belakang, kerana anda telah memperoleh semua 2000 berbilang keping data di latar belakang dan menyerahkannya ke meja depan akan memuatkan 2000 berbilang keping data ini apabila menjana halaman. Jika halaman dilengkapkan di latar belakang, setiap Jika hanya halaman semasa dihantar ke meja depan, seperti 50 kepingan data, halaman itu secara semula jadi akan menjadi lebih pantas apabila dipaparkan.

Anda boleh mencuba ini dahulu untuk melihat sama ada apa yang saya katakan betul:

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,
        }
    )

Saya hanya menambah satu [:50] pada kod di atas Kaedah .all() masih akan mendapat semua 2000 kepingan data, tetapi hanya bahagian 50 akan dihantar ke bahagian hadapan kelajuan pemaparan bahagian hadapan anda lebih cepat Ya, itu membuktikan bahawa kelajuan itu sendiri tiada kaitan dengan objects.all(), ia hanya berkaitan dengan jumlah data yang diterima oleh bahagian hadapan.

Dalam proses sebenar, paging latar belakang adalah lebih rumit sedikit daripada ini Jika kesimpulan saya di atas ok, saya akan mengemas kini semula...

伊谢尔伦

Tambah cache, tambah indeks dan tambah paging

Ty80

Jika anda menggunakan Django Restframework, anda boleh menggunakan fungsi paging yang disediakan secara asli oleh rangka kerja:

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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan