Совокупный почасовой подсчет, основанный на «ЧАС» в поле даты и времени в Джанго - PullRequest
0 голосов
/ 25 мая 2019

Я использую Django 2.2 вместе с MySQL.У меня есть следующий запрос: Вот модель для справки:

class TrackCount(models.Model):
    people_count_obj_id = models.CharField(primary_key=True, default=uuid.uuid4,
                                           editable=False, max_length=255)
    recorded_at = models.DateTimeField()
    camera = models.ForeignKey(Camera, on_delete=models.PROTECT)
    store = models.ForeignKey(Store, on_delete=models.PROTECT)
    people_count_in = models.IntegerField()
    people_count_out = models.IntegerField()
    created_at = models.DateTimeField(auto_now=True)
    is_unique = models.BooleanField(default=False)

    def __str__(self):
        return "{}.{}.{}".format(self.people_count_in,
                                 self.people_count_out, str(self.store))

    class Meta:
        verbose_name = 'Track Count'
        verbose_name_plural = 'Track Counts'

======================================================= Мой запрос выглядит следующим образом.

track_events = TrackCount.objects.filter(
            recorded_at__date=start_date.date(),
            recorded_at__hour__range=(8, 23),
            store__store_owner__id=self.kwargs['account_id']).order_by(
            'recorded_at'
        ).extra(
            select={
                'hour': 'hour(recorded_at)'
            }
        ).values(
            'hour'
        ).annotate(
            TotalPeople=Sum('people_count_in')
        )

Но когда я проверяю свои записи, я получаю следующий вывод:

[
    {
        "hour": 17,
        "TotalPeople": 22
    },
    {
        "hour": 17,
        "TotalPeople": 19
    },
    {
        "hour": 17,
        "TotalPeople": 30
    },
    {
        "hour": 18,
        "TotalPeople": 33
    },
    {
        "hour": 18,
        "TotalPeople": 31
    },
    {
        "hour": 18,
        "TotalPeople": 32
    },
    {
        "hour": 19,
        "TotalPeople": 32
    },
    {
        "hour": 19,
        "TotalPeople": 21
}] 

Но я бы хотел получить что-то вроде этого:

[{ "hour": 18, "TotalPeople": 96}....]то есть запись за один и тот же час должна быть суммирована вместе.

Надеюсь, моя точка зрения ясна.TIA

1 Ответ

0 голосов
/ 31 мая 2019

Хорошо, практически у меня ушло пару часов, чтобы расшифровать это. Поскольку я хотел получить ответ SUM-med для того же значения hour, последний запрос был примерно таким.

track_events = TrackCount.objects.filter(
            recorded_at__date=start_date.date(),
            recorded_at__hour__range=(8, 23),
            store__store_owner__id=self.kwargs['account_id']).order_by(
            'recorded_at'
        ).extra(
            select={
                'hour': 'hour(recorded_at)'
            }
        ).values(
            'hour'
        ).annotate(
            TotalPeople=Sum('people_count_in')
        ).order_by('hour')
...