Django每周汇总过去10周的值

时间:2018-09-27 11:59:17

标签: python django postgresql

给定日期,如何求和该日期所属的一周的总和以及前10个星期的总和?

最近30天的每一天都可以通过以下方式实现:

FREQ=DAILY; BYDAY=MON,TUE,WED,THU,FRI; BYHOUR=9,10,11,12,13,14,15,16,17;BYMINUTE= 30;

我想也可以通过遍历import datetime as dt from django.db.models import Sum last_30 = dt.date.today() - dt.timedelta(days=30) order_data = Order.objects.filter( date__gt=last_30).extra( select={'day': 'date(date)'}.values('day').annotate( total=Sum('total') ) print(order_data) <OrderQuerySet [{'day': datetime.date(2018, 8, 28), 'total': Decimal('50000.00'), {'day': datetime.date(2018, 8, 29), 'total': Decimal('84000.00'), '...(remaining elements truncated)...']> 将它们归类为事实之后的几周,但是我想知道是否还有另一种方法。

使用postgresql会有所不同。

1 个答案:

答案 0 :(得分:1)

您可以使用Django的ExtractWeek [Django-doc]获取日期的星期数。因此,我们可以先注释查询集,然后传递正确的值,例如:

from django.db.models.functions import ExtractWeek

qs = Order.objects.filter(date__gt=last_70).annotate(
    week=ExtractWeek('date')
).values('week').annotate(
    week_total=Sum('total')
).order_by('week')

这将产生类似的内容:

<QuerySet [
    { 'week': 14, 'week_total': 1425.0 }
    { 'week': 15, 'week_total': 1302.0 }
    { 'week': 17, 'week_total': 1993.0 }
]>

请注意

  1. .order_by很重要,因为否则这些值将“折叠”;
  2. 如果特定星期没有行,则这些行将不在查询集中,因此可能需要进行一些后期处理才能为此添加零;
  3. 作为per source code,它使用 Monday 作为一周的第一天;
  4. 因为您过滤了数据集,所以最早的周将只累加该周的子集(不算太旧的日子),因此将导致以下事实:该周的总和与该周的所有天都不匹配。