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

先看代码
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개 데이터 등 현재 페이지만 프런트 데스크로 전달되면 페이지 렌더링이 자연스럽게 빨라집니다.

제가 말한 내용이 맞는지 먼저 확인해 보세요.

으아악

위 코드에 [:50] 하나만 추가했습니다. .all() 메서드는 여전히 모든 2000 데이터를 가져오지만 50 조각만 프런트 엔드로 전달됩니다. 프런트 엔드 렌더링 속도가 빨라집니다. 예, 이는 속도 자체가 objects.all()과 관련이 없고 프런트 엔드에서 수신하는 데이터의 양에만 관련이 있음을 증명합니다.

실제 과정에서 백그라운드 페이징은 이보다 조금 더 복잡합니다. 위의 결론이 괜찮다면 다시 업데이트하겠습니다...

伊谢尔伦

캐시 추가, 인덱스 추가, 페이징 추가

Ty80

Django Restframework를 사용하는 경우 프레임워크에서 기본적으로 제공하는 페이징 기능을 사용할 수 있습니다.

참조: http://www.django-rest-framew...

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿