【问题标题】:Django lazy QuerySet and paginationDjango惰性查询集和分页
【发布时间】:2012-05-11 09:22:23
【问题描述】:

我读到here 说 Django 查询集是惰性的,在实际打印之前不会对其进行评估。我使用 django 的内置分页做了一个简单的分页。我没有意识到已经有诸如“django-pagination”和“django-endless”之类的应用程序可以完成这项工作。

无论如何,当我这样做时,我想知道 QuerySet 是否仍然是惰性的

entries = Entry.objects.filter(...)
paginator = Paginator(entries, 10)
output = paginator.page(page)
return HttpResponse(output)

每次我想要获取我当前想要查看的任何页面时都会调用这部分。

我需要知道,因为我不想给数据库带来不必要的负载。

【问题讨论】:

    标签: django lazy-loading django-queryset


    【解决方案1】:

    如果您想查看发生的位置,请导入 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':

    >>> 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'}]
    

    最后,条目已被提取。

    【讨论】:

    • 太棒了。我不知道 django 有用于检查是否进行查询的工具。
    • @starcorn 看看django-debug-toolbar
    • 调试工具栏是每个 Django 开发者都应该使用的工具,非常方便。
    【解决方案2】:

    是的。 Django 的分页使用与查询集相同的规则/优化。

    这意味着它将开始评估 return HttpResponse(output)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-02
      • 2013-04-10
      • 1970-01-01
      • 2014-08-27
      • 2012-08-27
      • 2011-03-22
      • 2017-02-07
      • 2012-12-20
      相关资源
      最近更新 更多