【问题标题】:Improving performance of Django admin list filter queries提高 Django 管理列表过滤器查询的性能
【发布时间】:2014-03-31 14:06:40
【问题描述】:

我正在围绕一个 PostgreSQL 数据仓库应用程序开发一个 Django 管理包装器,该应用程序有一些包含数百万条记录的表。

没有任何列表过滤器的管理员更改列表页面会在一秒钟内加载,但如果我在管理员的list_filters 中包含某些列,它加载非常缓慢,可能需要 30 秒到一分钟才能加载。

检查数据库,我看到了几个查询,例如:

SELECT DISTINCT "warehouse_data"."filter_field1" FROM "warehouse_data" ORDER BY "warehouse_data"."filter_field1" ASC;

每个只需要 3-5 秒,但有十几个,这些加起来。所有字段都已编入索引,因此我不确定如何加快它们的速度。如何提高管理员绩效?如何插入 Django 的缓存机制来缓存这些列表过滤器的实际查询?

【问题讨论】:

  • 我遇到了类似的问题,这篇文章对我有很大帮助,它可能对你有帮助blog.ionelmc.ro/2012/01/19/…
  • @fasouto,谢谢,帮了大忙。

标签: python django django-admin


【解决方案1】:

如您所见;缓慢来自 django 编译唯一值列表,以便它可以在侧边栏中显示它们。

在后台,这需要对数据库进行全表扫描,当您的表非常大时,这样做的成本会很高。如果您将此字段用作 list_filter;唯一值的数量很可能很少,并且您可以自己更有效地生成唯一值列表(假设您知道值的来源)。为此,您可以定义一个自定义 list_filter。

来自the docs(为简洁起见):

list_filter 应该是元素的列表或元组,其中每个元素 应该是以下类型之一:

  • 字段名
  • 继承自 django.contrib.admin.SimpleListFilter 的类
from datetime import date
from django.contrib import admin
from django.utils.translation import gettext_lazy as _

class DecadeBornListFilter(admin.SimpleListFilter):
    title = _('decade born')
    parameter_name = 'decade'

    def lookups(self, request, model_admin):
        return (
            ('80s', _('in the eighties')),
            ('90s', _('in the nineties')),
        )

    def queryset(self, request, queryset):
        # Compare the requested value (either '80s' or '90s')
        # to decide how to filter the queryset.
        if self.value() == '80s':
            return queryset.filter(birthday__gte=date(1980, 1, 1),
                                    birthday__lte=date(1989, 12, 31))
        if self.value() == '90s':
            return queryset.filter(birthday__gte=date(1990, 1, 1),
                                    birthday__lte=date(1999, 12, 31))

class PersonAdmin(admin.ModelAdmin):
    list_filter = (DecadeBornListFilter,)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-13
    • 2011-01-23
    • 2012-01-28
    • 2017-11-23
    • 2018-06-17
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    相关资源
    最近更新 更多