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

How to speed up Django's admin pages with PostgreSQL count estimates?

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

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

有可用于解决此问题的片段,但我不清楚如何实际使用它: https://djangosnippets.org/snippets/2593/

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

您可以通过覆盖 ModelAdmin.paginator

来使用它

The paginator class to be used for pagination. By default, django.core.paginator.Paginator is used. If the custom paginator class doesn’t have the same constructor interface as django.core.paginator.Paginator, you will also need to provide an implementation for 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 属性被重命名为 count 并且被装饰为 cached_property

自 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