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

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

学习是最好的投资!

répondre à tous(3)
Ty80

La pagination doit être effectuée en arrière-plan, car vous avez obtenu tous les 2000 multiples éléments de données en arrière-plan et les avez transmis à la réception. La réception chargera ces 2000 multiples éléments de données lors de la génération. la page. Si la pagination est terminée en arrière-plan, chaque Si seule la page actuelle est transmise à la réception, comme 50 des éléments de données, la page deviendra naturellement plus rapide lors du rendu.

Vous pouvez d'abord essayer ceci pour voir si ce que j'ai dit est juste :

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

Je n'en ai ajouté qu'un [:50] au code ci-dessus. La méthode .all() obtiendra toujours tous les 2000 éléments de données, mais seuls les 50 éléments seront transmis au front-end si cela se produit. votre vitesse de rendu front-end plus rapide Oui, cela prouve que la vitesse elle-même n'a rien à voir avec objects.all(), elle est uniquement liée à la quantité de données reçues par le front-end.

Dans le processus réel, la pagination en arrière-plan est légèrement plus compliquée que cela. Si ma conclusion ci-dessus est correcte, je la mettrai à jour à nouveau...

伊谢尔伦

Ajouter du cache, ajouter un index et ajouter une pagination

Ty80

Si vous utilisez Django Restframework, vous pouvez utiliser la fonction de pagination fournie nativement par le framework :

Référez-vous : http://www.django-rest-framew...

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal