如何在模型 Django 中创建过时记录的每周摘要

How to create a weekly summary of dated records in model django

我有一个模型,每天都有条目。我想为模型中的字段选择创建一个带有小计(注释)的查询集。

这是我目前所拥有的。

这是模型(或部分模型!)

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(weekcommencing 行)的字典并遍历模型以填充每行(weekcom)的一些 k,v 桶。但是,这感觉不对。

我也很感激这可以直接在 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

这会产生一个很好的字典,我可以在给定周开始日期和总数的情况下为我的报告迭代。

试试这个

Shiftlog.objects.values('date__week').annotate(Sum('km'))
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'
)