【问题标题】:Performance of django API view paginationdjango API视图分页的性能
【发布时间】:2019-07-16 13:35:38
【问题描述】:

我是 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'}

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

【问题讨论】:

标签: django django-rest-framework


【解决方案1】:

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

看看这个(使用 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'},
]

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

【讨论】:

  • 但是第一行是zones = Zone.objects.all(),它是否被忽略并且直到第二行才执行?
  • 谢谢,我找到了答案。它在文档中提到。查询集是惰性的,在评估之前没有数据库交互。 docs.djangoproject.com/en/1.11/topics/db/queries/…
  • @Sandhu 不,您可以从输出中看到构造分页器时的第一个查询不会立即执行(因此连接查询的空列表)。您可以在评估查询集时阅读文档。
猜你喜欢
  • 2016-01-02
  • 2022-11-04
  • 2013-12-25
  • 2017-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-28
  • 2014-10-12
相关资源
最近更新 更多