为了账号安全,请及时绑定邮箱和手机立即绑定

如何优化该算法的速度?Django 和 JavaScript

如何优化该算法的速度?Django 和 JavaScript

胡子哥哥 2023-12-14 16:42:23
我是 Javascript 新手,并且对 Django 有很好的经验。我为我的公司构建了一个图表平台来跟踪指标——它最初是作为学习 Javascript 的业余爱好项目,但后来演变成了更多东西。该网站正确加载和显示数据,但在移动设备上速度慢得令人难以置信。所有的计算都是在客户端由JS完成。有很多指标需要计算,因此思考过程是“以对象格式向客户端发送所有 Django 查询,并在那里处理它们,以免减慢服务器速度。” 我也不希望有大量的代码块来处理服务器上的每个指标(我这样做是错误的吗?)。这里有一些问题:一般来说,我应该在哪里处理数据,服务器端还是客户端?我该如何优化这段代码?我运行 3 个查询,需要查找每天每个指标的点击次数(页面浏览量、选择加入和计划调用)。例如,我想显示一个图表,显示一个月内的页面浏览量,其中 x 轴是日期,y 轴是计数。为了做到这一点,我运行一个嵌套的 for 循环来迭代查询,然后计算该日期的页面浏览量。当我针对三个不同的指标运行此函数时,速度非常慢。数据通过 ajax 调用接收(这是最佳的吗?)。以下是计算当天点击次数的 Javascript 代码:var endpoint = "/my/url/";        var opt_ins = [];        var schedules = [];        var page_views = [];        $.ajax({            method: "GET",            url: endpoint,            success: function (data) {                opt_ins = data.opt_ins;                schedules = data.audit_calls;                page_views = data.page_views;            },            error: function (error) { console.log("ERROR -->  " + error); },            async: false        });async function getDateCounts(data) {            dates = [];            count_dates = [];            let i = 0;            for (const element of data) {                let date = new Date(element.date_created).toLocaleDateString("en-US");                if (!dates.includes(date)) {                    dates.push(date);                    let count = 0;                    for (const item of data) {                        let check_date = new Date(item.date_created).toLocaleDateString("en-US");                        if (check_date === date) {                            count++;                        }                    }                    count_dates.push(count);                    count = 0;                }            }            return [dates, count_dates];每个查询都会返回一个不同长度的对象。以下是包含示例数据的最终图表的示例
查看完整描述

1 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

数据库是聚合这些数据的好地方,并将减少需要传递的数据量。


该aggregate()方法将使您获得如下数据集:


[{'date':COUNT},{'date':COUNT},...]

TruncDate()如果您有日期时间,则允许按天分组。


from django.db.models import Sum

from django.db.models.functions import TruncDate



models.AgentPageViews.objects.filter(date_created__gt=self.time_period).

    values(date=TruncDate('date_created')).

    order_by("date_created").annotate(Sum('views')


查看完整回答
反对 回复 2023-12-14
  • 1 回答
  • 0 关注
  • 47 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信