首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >改进Django管理列表筛选查询的性能

改进Django管理列表筛选查询的性能
EN

Stack Overflow用户
提问于 2014-02-27 21:10:55
回答 1查看 2.6K关注 0票数 9

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

没有任何列表筛选器的管理变更列表页面将在一秒钟内加载,但是如果我在管理员的list_filters中包含了某些列,则加载它的速度非常慢,加载时间从30秒到一分钟不等。

检查数据库时,我看到了以下几个查询:

代码语言:javascript
运行
复制
SELECT DISTINCT "warehouse_data"."filter_field1" FROM "warehouse_data" ORDER BY "warehouse_data"."filter_field1" ASC;

每一次只需要3-5秒,但由于有十几个,这些加起来。所有的字段都是索引的,所以我不知道如何才能加快它们的速度。如何提高管理性能?如何插入Django的缓存机制来缓存这些列表过滤器的实际查询?

EN

回答 1

Stack Overflow用户

发布于 2019-10-30 17:05:19

正如您所观察到的,慢的原因是django编译了唯一值的列表,这样它就可以在侧栏中显示它们。

在遮罩下,这需要对数据库进行完整的表扫描,当您的表非常大时,这是非常昂贵的。如果您将此字段用作list_filter,则很有可能惟一值的数量很小,并且您可以自己更有效地生成唯一值列表(假设您知道这些值来自何处)。为此,您可以定义一个自定义list_filter。

来自医生们 (浓缩为长寿):

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

  • 字段名
  • 从django.contrib.admin.SimpleListFilter继承的类
代码语言:javascript
运行
复制
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,)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22080469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档