如何使用PostgreSQL计数估算来加速Django的管理页面?

时间:2016-10-04 09:40:19

标签: django performance postgresql admin paginator

众所周知,当数据库表有很多行时,Django的管理列表视图变得相当慢。那是因为Django paginator默认使用(慢)PostgreSQL COUNT查询。

因为估计对我们来说没问题,而且速度要快得多,例如: SELECT reltuples FROM pg_class WHERE relname = "my_table_name"

可以使用代码片来解决此问题,但我不清楚如何实际使用它: https://djangosnippets.org/snippets/2593/

此外,该代码段不应用于过滤结果。那是因为如上所示的估计计数在这里不起作用。还有另一种方法可以加速Django管理页面中的过滤列表视图吗?

2 个答案:

答案 0 :(得分:1)

您可以通过覆盖ModelAdmin.paginator

来使用它
  

用于分页的paginator类。默认情况下,   使用django.core.paginator.Paginator。如果是自定义paginator类   没有相同的构造函数接口   django.core.paginator.Paginator,你还需要提供一个   ModelAdmin.get_paginator()的实现。

class MyModelAdmin(admin.ModelAdmin):
    paginator = CachingPaginator

奖励功能:我已经对该代码段进行了改进,以创建一个可以使用和不使用过滤器的代码段:https://gist.github.com/e4c5/6852723它在可能的情况下从rel_tuples获取计数但是当使用过滤器时,计数将保存到缓存中。 / p>

更新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属性重新命名的一些过时所取代,并且它被装饰为cached_property

答案 1 :(得分:1)

从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