【问题标题】:Count on big Django Datas依靠大 Django 数据
【发布时间】:2021-02-12 16:55:34
【问题描述】:

我有一个 LogTable,每周大约有 500k 个条目。

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()。我觉得有一个简单的答案,但我就是找不到。

感谢您帮助我。

【问题讨论】:

    标签: django django-models django-aggregation


    【解决方案1】:

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

    datetime 字段是索引吗?

    您是否尝试通过 datetime 请求 1 个数据库结果订单并在 Django 中拆分它,有时数据库访问比在 Python 中拆分成本更高。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-02
      相关资源
      最近更新 更多