依靠大型Django数据

问题描述

我有一个LogTable,每周大约有50万条记录。

models.py

class Log(models.Model):
   timestamp= models.DateTimeField()
   name = models.CharField(max_length=30)
   status = models.PositiveIntegerField()
   objects = LogManager()

我想按时间戳对条目进行分组,并获取每个时间戳每个状态的计数值。像这样:

timestamp      | automated | offline | user | inactive
29.10.20 17:40 |    5      |   40    |  30  |    15
29.10.20 17:45 |    10     |  ....

我曾与这样的经理一起尝试过:

class LogManager(models.Manager):
def auto(self,timestamp):
    return self.filter(datetime__exact=timestamp).filter(status__exact=0).count()
def inactive(self,timestamp):
    return self.filter(datetime__exact=timestamp).filter(status__exact=1).count()
def offline(self,timestamp):
    return self.filter(datetime__exact=timestamp).filter(status__exact=2).count()
def user(self,timestamp):
    return self.filter(datetime__exact=timestamp).filter(status__exact=3).count()
def activity(self,timestamp):
    data = {
        'timestamp': timestamp,'auto' : self.auto(timestamp),'inactive' : self.inactive(timestamp),'offline': self.offline(timestamp),'user': self.user(timestamp),}
    return data
    def activity_sum(self):
       obj = self.values_list('datetime',flat=True)
       data = {}
       for i,time in enumerate(obj):
          data[i] = self.activity(time)
       return data

但这不是方法,因为如果我将计算结果持续约10分钟, 调用Log.objects.activity_sum()。我觉得这里有一个简单的答案,但我找不到。

感谢您的帮助。

解决方法

我的初读,告诉我永远不要循环查询,这将是您的第一个改进。

datetime字段是否为索引?

您是否尝试过按datetime请求1个数据库结果顺序并将其在Django中拆分,有时数据库访问权限比在Python中拆分费用更高。

https://docs.djangoproject.com/fr/3.0/ref/models/indexes/ https://stackoverflow.com/a/37382695/5073377

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...