django的admin速度慢优化:date_hierarchy、list_filter

2024-06-10 20:48

本文主要是介绍django的admin速度慢优化:date_hierarchy、list_filter,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

项目是一个django的后台系统,有一个表大概有180万条数据,打开页面基本要10多秒,自己都要受不了了。第一次尝试对项目进行优化。

首先查到用django-debug-toolbar查询了下那些sql语句耗时。

django-debug-toolba文档:https://django-debug-toolbar.readthedocs.io/en/latest/installation.html

可以看到sql查询一共耗时大概10秒。

 

主要是这四条sql语句耗时:

1、django分页sql:

SELECT COUNT(*) AS `__count` FROM `push_rule` WHERE (`push_rule`.`deleted` = 0 AND `push_rule`.`id` > 0)

 

2、 自定义ModelAdmin中list_filter的字段sql:

SELECT DISTINCT `push_rule`.`operator` FROM `push_rule` WHERE (`push_rule`.`deleted` = 0 AND `push_rule`.`id` > 0) ORDER BY `push_rule`.`operator` ASC

 

 3、自定义ModelAdmin的date_hierarchy选项sql:

SELECT MAX(`push_rule`.`insert_time`) AS `last`, MIN(`push_rule`.`insert_time`) AS `first` FROM `push_rule` WHERE (`push_rule`.`deleted` = 0 AND `push_rule`.`id` > 0)

 

 4、还是自定义ModelAdmin的date_hierarchy选项sql:

SELECT DISTINCT CAST(DATE_FORMAT(`push_rule`.`insert_time`, '%Y-%m-%d 00:00:00') AS DATETIME) AS `datetimefield` FROM `push_rule` WHERE (`push_rule`.`deleted` = 0 AND `push_rule`.`id` > 0 AND `push_rule`.`insert_time` BETWEEN '2019-01-01 00:00:00.000000' AND '2019-12-31 23:59:59.999999' AND EXTRACT(MONTH FROM `push_rule`.`insert_time`) = 7 AND `push_rule`.`insert_time` IS NOT NULL) ORDER BY `datetimefield` ASC

 


第一条暂未优化。

第二条重写一个OperatorFilter:

不从大表push_rule里查询文章的Operaor,直接从django自带的User模型类中查询Operator,User模型里的auth_user表一共也就几百个人,几乎是不用耗时的。不过也也会有点问题,User中展示的是所有user,而push_rule查到的是所有发布的文章中的所有所有作者,有些差别,不过问题不大。

OperatorFilter代码:

from django.contrib.auth.models import Userclass OperatorFilter(admin.SimpleListFilter):title = _('Who')parameter_name = 'operator'def lookups(self, request, model_admin):staff_operator_set = User.objects.filter(is_staff=1)return [(c,c) for c in sorted(staff_operator_set)]def queryset(self, request, queryset):return queryset.filter(operator=self.value()) if self.value() else queryset

设置list_filter: 

list_filter  = (OperatorFilter)

第三条第四条都是date_hierarchy的问题所以一起处理,这个date_hierarchy最耗时间:

搜索到了大神写好的解决方案:

https://hakibenita.com/scaling-django-admin-date-hierarchy?source=post_page---------------------------

这位大神写了好多django优化的文章。

没看原理,直接拿来用了。

1、安装写好的包django-admin-lightweight-date-hierarchy:

pip install django-admin-lightweight-date-hierarchy

安装要求:

Python 2.7, 3.4, 3.5, 3.6

Django 1.9, 1.10, 1.11, 2.0

2、注册INSTALL_APP

INSTALLED_APPS = ('django_admin_lightweight_date_hierarchy',
)

3、自定义ModelAdmin中设置:date_hierarchy_drilldown = False

class MyModelAdmin(admin.ModelAdmin):date_hierarchy = 'created'date_hierarchy_drilldown = False

到此本次优化基本结束:

再看一下耗时:

 

优化到2秒了,只剩django分页sql的比较耗时了。

 

这篇关于django的admin速度慢优化:date_hierarchy、list_filter的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1049229

相关文章

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

Python中合并列表(list)的六种方法小结

《Python中合并列表(list)的六种方法小结》本文主要介绍了Python中合并列表(list)的六种方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录一、直接用 + 合并列表二、用 extend() js方法三、用 zip() 函数交叉合并四、用

Java List排序实例代码详解

《JavaList排序实例代码详解》:本文主要介绍JavaList排序的相关资料,Java排序方法包括自然排序、自定义排序、Lambda简化及多条件排序,实现灵活且代码简洁,文中通过代码介绍的... 目录一、自然排序二、自定义排序规则三、使用 Lambda 表达式简化 Comparator四、多条件排序五、

Spring Boot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)

《SpringBoot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)》:本文主要介绍SpringBoot拦截器Interceptor与过滤器Filter深度解析... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实