Django Множественные запросы

Я использую множество запросов для нахождения суммы полей [ft_day, ft_night] в нескольких записях за определенные интервалы времени, например, последние 7 дней, последние 6 месяцев и т.д.

Это необходимо для отображения в шаблоне суммарного времени в вышеупомянутых интервалах дат.

ft_total является свойством в Models

Есть ли более эффективный способ сделать это? Не совсем придерживаюсь DRY здесь.

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

views.py get_context_data()

## shortened ##
context['last_6_months_rpic'] = RPLogbookEntry.objects.filter(user=self.request.user, user_role='RPIC', entry_date__range=(datetime.datetime(int(self.date_now.year - (self.date_now.month - 5)/12), (self.date_now.month - 6) % 12 - 1, self.date_now.day), self.date_now)
).annotate(ft_total = F('ft_day') + F('ft_night')).aggregate(Sum('ft_total'))
context['last_12_months_rpic'] = RPLogbookEntry.objects.filter(user=self.request.user, user_role='RPIC', entry_date__range=(datetime.datetime(int(self.date_now.year - (self.date_now.month - 12)/12), (self.date_now.month - 12) % 12 - 1, self.date_now.day), self.date_now)
).annotate(ft_total = F('ft_day') + F('ft_night')).aggregate(Sum('ft_total'))

Вы можете передать фильтр в Sum, это позволяет вам делать несколько сумм с различными фильтрами в одном агрегате

RPLogbookEntry.objects.filter(
    user=self.request.user,
    user_role='RPIC',
).annotate(
    ft_total=F('ft_day') + F('ft_night')
).aggregate(
    last_6_months_rpic=Sum('ft_total', filter=Q(entry_date__range=(datetime.datetime(int(self.date_now.year - (self.date_now.month - 5)/12), (self.date_now.month - 6) % 12 - 1, self.date_now.day), self.date_now))),
    last_12_months_rpic=Sum('ft_total', filter=Q(entry_date__range=(datetime.datetime(int(self.date_now.year - (self.date_now.month - 12)/12), (self.date_now.month - 12) % 12 - 1, self.date_now.day), self.date_now))),
)
Вернуться на верх