Как создать еженедельную сводку датированных записей в модели django - PullRequest
1 голос
/ 11 марта 2020

У меня есть модель, в которой есть записи на каждый день. Я хочу создать набор запросов с промежуточными итогами (аннотациями) для выбора полей в модели.

Это то, что у меня есть до сих пор.

Вот модель (или часть ее!)

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

Это дает хороший словарь, который я могу перебрать для своего отчета, учитывая дату начала недели и итоги.

Ответы [ 2 ]

0 голосов
/ 11 марта 2020
from django.db.models.functions import ExtractYear, ExtractWeek


Shiftlog.objects.annotate(
    week=ExtractWeek('date'),   
    year=ExtractYear('date')
).annotate(
     date=F('week')+F('year')
).values(
    'date'
).annotate(
     s=Sum('km')
).values(
    'date',
    's'
).order_by(
   'date'
)
0 голосов
/ 11 марта 2020

Попробуйте это

Shiftlog.objects.values('date__week').annotate(Sum('km'))
...