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))),
)