2016-10-04 55 views
3

当数据库表有很多行时,Django的管理列表视图变得相当慢。这是因为Django paginator默认使用(慢)PostgreSQL COUNT查询。如何加快Django的管理页面与PostgreSQL计数估计?

由于估计会被罚款,我们和它的速度更快,例如: SELECT reltuples FROM pg_class WHERE relname = "my_table_name"

有段来修复这个问题,但它是我不清楚如何实际使用它: https://djangosnippets.org/snippets/2593/

此外,该代码段不应该用于过滤结果。这是因为上面显示的估算数量在这里不起作用。有没有另一种方法来加快Django管理页面中的过滤列表视图?

回答

1

您可以通过重写用于分页的ModelAdmin.paginator

的分页程序类使用它。默认情况下,使用 django.core.paginator.Paginator。如果自定义分页程序类 没有与 django.core.paginator.Paginator相同的构造程序接口,则还需要为ModelAdmin.get_paginator()提供 实现。

class MyModelAdmin(admin.ModelAdmin): 
    paginator = CachingPaginator 

奖金特点:我对段提高到创建一个使用和不使用过滤器的工作原理:https://gist.github.com/e4c5/6852723它从rel_tuples使用过滤器计数被保存到缓存时可能的,但是当计数。

更新1:
在你的答案下文称原来的片段中的问题是由于这种变化在1.6版本注释宣布:https://docs.djangoproject.com/en/1.10/releases/1.6/#get-query-set-and-similar-methods-renamed-to-get-queryset

这是一个小小的更正。

更新2
我提高到原来的片断已做了一些什么用_count PROPERT过时被重命名为计数并且也被装饰成一个cached_property

+0

我看到如何使用它;但是这两个脚本似乎都不适用于Django 1.10。您的返回错误'CachingPaginator对象没有属性'_count' - 原始脚本返回''LargeTableChangeList'对象没有属性'query_set' - 任何想法? –

+0

感谢您的更新。不幸的是,仍然没有工作。将'_count'重命名为'count'。现在,我得到错误:“如果self.count为None:' - 在您和其他代码片段中调用一个Python对象'时,超出最大递归深度'。 –

+0

我认为我们现在远离了问题的原始范围,即关于如何使用该片段,我认为在这里我们已经充分说明了这一点。请发布一个新问题,说您使用此代码段(包括问题本身的代码)以及错误跟踪 – e4c5

0

还有就是要选择所需的选项因为Django的1.8的行为:https://docs.djangoproject.com/en/1.8/ref/contrib/admin/#django.contrib.admin.ModelAdmin.show_full_result_count

例子:

class MyModelAdmin(admin.ModelAdmin): 
    show_full_result_count = False 
+0

欢迎您访问解决方案的链接,但请确保您的答案在没有它的情况下很有用:[在链接附近添加上下文](// meta.stackexchange.com/a/8259),以便您的同行用户了解它是什么以及为什么它在那里,然后引用您链接的页面中最相关的部分,以防目标页面不可用。 [仅仅是一个链接的答案可能会被删除。](// stackoverflow.com/help/deleted-answers) –