У меня есть модель, в которой есть записи на каждый день. Я хочу создать набор запросов с промежуточными итогами (аннотациями) для выбора полей в модели.
Это то, что у меня есть до сих пор.
Вот модель (или часть ее!)
class Shiftlog(models.Model):
date = models.DateField(default=timezone.now)
onlinetime = models.DurationField()
trips = models.IntegerField(default=0)
km = models.IntegerField(default=0)
def weekcom(self):
weekcom = self.date - timedelta(days=self.date.weekday())
return weekcom
Вот код представления, который представляет меня пытаясь достичь.
report = Shiftlog.objects.values('weekcom').annotate(Sum('km'))
Теперь это не работает. Из других сообщений я вижу, что функциональность аннотирования работает только с полями модели.
Я ценю, что могу создать словарь weekcom (строки, начинающиеся с недели) и выполнить итерацию по модели, чтобы заполнить несколько k, v сегментов для каждой строки (weekcom). Однако это не правильно.
Я также ценю, что это можно сделать непосредственно в SQL (я еще не переходил на эту опцию, поэтому у меня нет кода), но я тоже стараюсь избегать этой опции.
Любое руководство, высоко ценится. Спасибо!
***** Обновление.
Спасибо вам обоим за ваши ответы. Оба были очень полезны по-разному. С вашей помощью я решил свою проблему.
Вот мое решение.
data = Shiftlog.objects.values('date__iso_year','date__week').annotate(Sum('km'))
for entry in data:
entry.update({'week_startdate':
_startweekdate(entry['date__iso_year'],entry['date__week'])})
def _startweekdate(year,weekno):
weekstartdate = datetime.strptime(str(year)+'-W'+str(weekno)+'-1', "%G-W%V-%w").date()
return weekstartdate
Это дает хороший словарь, который я могу перебрать для своего отчета, учитывая дату начала недели и итоги.