我在这里阅读到Django查询集是惰性的,只有在实际打印出来后才会对其进行评估。我使用django的内置分页进行了简单的分页。我没有意识到已经有诸如“ django-pagination”和“ django-endless”之类的应用程序可以做到这一点。
无论如何,当我这样做时,我想知道QuerySet是否仍然很懒
entries = Entry.objects.filter(...) paginator = Paginator(entries, 10) output = paginator.page(page) return HttpResponse(output)
每当我想要获得当前要查看的任何页面时,都会调用此部分。
我需要知道,因为我不想不必要地加载数据库。
如果要查看发生的位置,请导入django.db.connection并检查queries
django.db.connection
queries
>>> from django.db import connection >>> from django.core.paginator import Paginator >>> queryset = Entry.objects.all()
让我们创建分页器,看看是否发生任何查询:
>>> paginator = Paginator(queryset, 10) >>> print connection.queries []
还没有。
>>> page = paginator.page(4) >>> page <Page 4 of 788> >>> print connection.queries [{'time': '0.014', 'sql': 'SELECT COUNT(*) FROM `entry`'}]
创建页面产生了一个查询,以计算查询集中有多少个条目。尚未提取条目。
将页面的对象分配给变量“对象”:
>>> objects = page.object_list >>> print connection.queries [{'time': '0.014', 'sql': 'SELECT COUNT(*) FROM `entry`'}]
这仍然没有导致条目被提取。
HttpResponse从对象列表生成
>>> response = HttpResponse(page.object_list) >>> print connection.queries [{'time': '0.014', 'sql': 'SELECT COUNT(*) FROM `entry`'}, {'time': '0.011', 'sql': 'SELECT `entry`.`id`, <snip> FROM `entry` LIMIT 10 OFFSET 30'}]
最终,已获取条目。