5

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

__range对于使用日期过滤器的 QuerySet,有没有办法让 QuerySet 按工作日分组?我正在尝试按工作日对结果进行分组,以获取介于任意两个日期之间的查询(可能相隔一年)。我知道如何获取与 weekday 匹配的行,但这需要用 7 个查询敲击数据库才能找出每个工作日的数据。

几个小时以来,我一直试图通过对__week_day过滤器进行不同的调整来解决这个问题,但没有任何效果。即使谷歌搜索也无济于事,这让我想知道这是否可能。如果可以的话,这里的任何 Django 大师都知道怎么做?

4

4 回答 4

9

由于已弃用,这是一种使用ExtractDayOfWeekextra对星期几进行分组的新方法。

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

于 2016-12-01T21:59:49.647 回答
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

于 2013-06-22T22:57:52.157 回答
0

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

给定模型:

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

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

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),则不需要进行取模。

于 2013-10-04T00:14:33.937 回答
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()
于 2014-07-23T14:34:31.167 回答