Как сгруппировать объекты по часам с наборами запросов django? - PullRequest
2 голосов
/ 29 марта 2019

Допустим, у меня есть модель, которая выглядит следующим образом:

class Action(models.Model):
    timestamp = models.DateTimeField(default=timezone.now)
    # ...

Как мне, в представлении,

  • Получить все объекты действий
    • Action.objects
  • Сгруппируйте их в 24 скобки (используя свойства QuerySet, возможно, group?), Например так:

    { 0: [Action1, Action2, Action3], # timestamp between 00:00 and 00:59, any day
      1: [Action4], # timestamp between 01:00 and 01:59, any day
      # ...
      23: [ActionN] # timestamp between 23:00 and 23:59, any day
    }
    

По сути, мне нужен график, показывающий, сколько действий было выполнено, с разрешением в час.

1 Ответ

1 голос
/ 29 марта 2019

Вы можете использовать функцию ExtractHour , чтобы получить час из поля даты и времени, а затем сгруппировать записи в dict.

Пример кода для вашей справки:

from collections import defaultdict
from django.db.models.functions import ExtractHour

# create a new field to extract hour from timestamp field
actions = Action.objects.annotate(hour=ExtractHour('created'))

# create a default dict to insert a list if key is not exist
results = defaultdict(lambda: [])
for row in actions:
    results[row.hour].append(row)

Примечание:

Если вы используете базу данных mysql, пожалуйста, не забудьте загрузить информацию о часовом поясе перед использованием Extract functions

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
...