【问题标题】:How to implement a paginator that doesn't call count(*)如何实现不调用 count(*) 的分页器
【发布时间】:2011-10-09 22:33:52
【问题描述】:

我正在开发一个具有 MySQL innodb 后端的 django 网站。我们的几个表中有数十万条记录,这导致了管理员中的一些站点稳定性/性能问题。具体来说,django 喜欢在创建分页器时进行 count(*) 查询,这会导致很多问题。

在 Django 1.3.x 中,他们开始允许提供自定义分页类。因此,我有兴趣找到一种适当加快或消除这些查询的方法。到目前为止,我一直在看这两页:http://code.google.com/p/django-pagination/source/browse/trunk/pagination/paginator.py https://gist.github.com/1094682 并没有真正发现它们是我正在寻找的东西。任何建议,帮助等。将不胜感激。

【问题讨论】:

  • 数十万条记录算不了什么。解雇你的 DBA 并找到一个知道他们在做什么的人。
  • a) 由于多种原因,不能选择迁移到新数据库 b) 我的 dba 的名字是 django,尽管我很想解雇他,但我宁愿不重建整个应用程序
  • 正确,我们没有专门的 DBA...但是考虑到 django 自动生成表,并且大部分管理员也是自动生成的,这可能不会有太大作用。 MySQL 很烂,是的,我知道。我没有建立这个系统,我只是去维护它。我经常在不同的数据库上使用比这更大的数据集并且没有任何问题,不幸的是,此时切换数据库不是我们的预算。尽管我很想听听我可以做些什么来解决这个问题。我需要一个程序化的解决方案,而不是软件或硬件。
  • 数据库服务器不仅仅是架构。
  • ffs,没有一条有用的评论。 '解雇你的 DBA'?很有帮助

标签: django admin paginator


【解决方案1】:

您可以在分页器中定义 _count 变量

  paginator = Paginator(QuerySet, 300)
  paginator._count = 9000 # or use some query here

这里是 django 分页器代码的一部分,可帮助您了解此变量的作用以及页面计数的工作原理

def _get_count(self):
    "Returns the total number of objects, across all pages."
    if self._count is None:
        try:
            self._count = self.object_list.count()
        except (AttributeError, TypeError):
            # AttributeError if object_list has no count() method.
            # TypeError if object_list.count() requires arguments
            # (i.e. is of type list).
            self._count = len(self.object_list)
    return self._count
count = property(_get_count)

【讨论】:

  • 这是一个老问题,但添加一个小说明是有意义的:如果您将 Paginator 子类化并在 Paginator.__init__() 方法中设置 _count 值,请确保设置值 之后你调用了 super().__init__(),因为基础分页器将 _count 和 _num_pages 设置为 None(这违背了练习的目的)。
  • @errx paginator._count = 9000 没有任何效果。仍在触发计数查询
  • @Jenish 设置 paginator.count 而不是 paginator._count 在这里为我工作
【解决方案2】:

你可以自己通过计数

paginator = Paginator(models ,25 )
paginator.count=100000

或者如果你想要确切的计数,你可以使用

count=int(model.objects.latest('id').id)
paginator = Paginator(models ,25 )
paginator.count=count

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
【解决方案3】:

您也可以查看django-endless-pagination.endless_pagination.paginator.LazyPaginator 还不错,但您可能需要添加一些调整。

【讨论】:

    猜你喜欢
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    相关资源
    最近更新 更多