如何在模型 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'
)
我有一个模型,每天都有条目。我想为模型中的字段选择创建一个带有小计(注释)的查询集。
这是我目前所拥有的。
这是模型(或部分模型!)
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'
)