Django Group By Weekday?

时间:2013-06-22 19:56:46

标签: python django python-3.x django-1.5

我正在使用Django 1.5.1,Python 3.3.x,并且不能使用原始查询。

对于使用日期__range过滤器的QuerySet,是否有办法按工作日获取QuerySet?我试图按工作日对结果进行分组,查询范围介于任意两个日期之间(可能相差多达一年)。我知道如何get rows that match a weekday,但这需要用7个查询敲击数据库,以找出每个工作日的数据。

我一直试图通过使用__week_day过滤器尝试不同的调整来解决这个问题,但没有任何效果。即使谷歌搜索没有帮助,这让我想知道这是否可能。任何Django大师都在这里知道如果有可能吗?

4 个答案:

答案 0 :(得分:4)

由于不推荐使用extra,因此以下是使用ExtractDayOfWeek在一周中进行分组的新方法。

from django.db.models.functions import ExtractWeekDay
YourObjects.objects
    .annotate(weekday=ExtractWeekDay('timestamp')) 
    .values('weekday')                          
    .annotate(count=Count('id'))                  
    .values('weekday', 'count')   

这将返回如下结果:

[{'weekday': 1, 'count': 534}, {'weekday': 2, 'count': 574},.......}

同样重要的是要注意1 =星期日和星期六= 7

答案 1 :(得分:1)

好吧,我做了一个算法,这个算法为你带来了从本周开始(星期一)到今天的所有记录

例如,如果您的应用中有这样的模型:

from django.db import models

class x(models.Model):
        date = models.DateField()

from datetime import datetime
from myapp.models import x
start_date = datetime.date(datetime.now())
week = start_date.isocalendar()[1]
day_week =start_date.isoweekday()
days_quited = 0
less_days = day_week
while less_days != 1:
     days_quited += 1
     less_days -= 1

week_begin = datetime.date(datetime(start_date.year,start_date.month,start_date.day-days_quited))

records = x.objects.filter(date__range=(week_begin, datetime.date(datetime.now())))

如果您在管理员中添加一些范围介于6月17日(星期一)和6月22日(今天)之间的记录,您将看到所有这些记录,如果您添加更多记录,例如明天的日期,或者下周一的日期你将看不到那些记录。

如果你想要其他周的记录,你现在只需要这样:

start_date = datetime.date(datetime(year, month, day))
records = x.objects.filter(date__range=(week_begin, datetime.date(datetime.now())))

希望这有帮助! :d

答案 2 :(得分:0)

您需要在选择中添加额外的工作日字段,然后在总和或平均聚合中将其分组。请注意,这将成为特定于数据库的查询,因为“额外”表示法将传递到DB select语句。

鉴于模型:

class x(models.Model):
    date = models.DateField()
    value = models.FloatField()

然后,对于mysql,使用ODBC工作日到python datetime工作日的映射:

x.objects.extra(select={'weekday':"MOD(dayofweek(date)+5,7)"}).values('weekday').annotate(weekday_value=Avg('value'), weekday_value_std=StdDev('value'))

注意,如果你不需要将MySql ODBC工作日(1 =星期日,2 =星期一......)转换为python工作日(星期一是0,星期日是6),那么你不需要做模数

答案 3 :(得分:0)

对于这样的模型:

class A(models.Model):
    date = models.DateField()
    value = models.FloatField()

您可以使用查询:

weekday     = {"w": """strftime('%%w', date)"""}
qs = A.objects.extra(select=weekday).values('w').annotate(stat = Sum("value")).order_by()