首页 > 解决方案 > django API视图分页的性能

问题描述

我是 python django 的新手。我正在使用 APIView。我正在查看分页代码。我查看了许多代码,但在所有这些代码中,我都有一个担忧。

他们都从表中获取所有数据,然后对这些数据进行分页。

zones = Zone.objects.all()
paginator = Paginator(zones, 2)
page = 2
zones = paginator.page(page)
serializer = ZoneSerializer(zones, many=True)
return {"data": serializer.data, 'count': zones.paginator.count, "code": status.HTTP_200_OK, "message": 'OK'}

我的期望是我没有得到所有记录,然后使用分页器进行分页。否则我将不得不编写自己的代码来处理它。

标签: djangodjango-rest-framework

解决方案


它从数据库中获取所有记录是不正确的。

看看这个(使用 django shell)。注意LIMIT

from django.db import connection
from apps.question.models import Question
from django.core.paginator import Paginator

p = Paginator(Question.objects.all(),2)

print(connection.queries)
[]

p.page(1)[0] # Accessing one element in page

print(connection.queries)

[{'sql': 'SELECT COUNT(*) AS "__count" FROM "question"',
  'time': '0.001'},
 {'sql': 'SELECT <all fields> FROM "question" ORDER BY "question"."id" DESC  LIMIT 2',
  'time': '0.000'},
]

注意:我从第二个查询中删除了所有字段的列表,所以它很适合这里。


推荐阅读