我正在使用Django 1.5.1,Python 3.3.x,并且不能使用原始查询。
对于使用日期__range
过滤器的QuerySet,是否有办法按工作日获取QuerySet?我试图按工作日对结果进行分组,查询范围介于任意两个日期之间(可能相差多达一年)。我知道如何get rows that match a weekday,但这需要用7个查询敲击数据库,以找出每个工作日的数据。
我一直试图通过使用__week_day
过滤器尝试不同的调整来解决这个问题,但没有任何效果。即使谷歌搜索没有帮助,这让我想知道这是否可能。任何Django大师都在这里知道如果有可能吗?
答案 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()