众所周知,当数据库表有很多行时,Django的管理列表视图变得相当慢。那是因为Django paginator默认使用(慢)PostgreSQL COUNT
查询。
因为估计对我们来说没问题,而且速度要快得多,例如:
SELECT reltuples FROM pg_class WHERE relname = "my_table_name"
可以使用代码片来解决此问题,但我不清楚如何实际使用它: https://djangosnippets.org/snippets/2593/
此外,该代码段不应用于过滤结果。那是因为如上所示的估计计数在这里不起作用。还有另一种方法可以加速Django管理页面中的过滤列表视图吗?
答案 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