Рассчитывайте на большие данные Django

У меня есть LogTable с около 500 тыс. записей в неделю.

модели.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(). Я чувствую, что есть простой ответ, но я просто не могу его найти.

Спасибо за помощь.


person Amiribus    schedule 30.10.2020    source источник


Ответы (1)


Мое первое чтение сказало мне никогда не делать запросы в цикле, это будет вашим первым улучшением.

Является ли поле datetime индексом?

Вы пытались запросить 1 порядок результатов базы данных с помощью datetime и разделить его в Django, иногда доступ к базе данных обходится дороже, чем разделение в Python.

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

person MaximeK    schedule 30.10.2020