如何使用 Django ORM 按周分组

Posted

技术标签:

【中文标题】如何使用 Django ORM 按周分组【英文标题】:How to group by week with Django ORM 【发布时间】:2018-08-12 18:56:33 【问题描述】:

我正在使用以下 SQL 代码检查上周日:

DATE_ADD(tbl.date, INTERVAL (- 1) * DAYOFWEEK(tbl.date) + 1 DAY) AS 一周

你能告诉我是否可以使用 django 模型吗?

我完全不知道该怎么做。

换句话说,我想在查询中按星期天分组

我的模特:

class tbl_data( models.Model ):

    date = models.DateField(verbose_name="Date")
    identifier = models.CharField(max_length=10, verbose_name="Identifier")
    value = models.FloatField(verbose_name="Value")

    def __unicode__(self):
        return str( self.date ) + '-' + str( self.identifier )

数据每天都在上传,我想按周分组(周日是我的第一天)

提前致谢,

【问题讨论】:

是的,你可以用 django 做到这一点。 太好了 :-) 你能解释一下我是怎么做到的吗? 你做模型了吗?从那里开始。然后向我们展示该代码并在该上下文中提出问题。 是的,我已经制作了模型,只是编辑了主帖。谢谢 Django DateField 在 Python 中由 datetime.date 实例表示,因此在 Python 代码中,您可以在其上使用 date.weekday()date.isoweekday()。然后按照@cezar 的建议使用聚合 【参考方案1】:

您没有说明您使用的是哪个数据库系统,但我假设它是 mysql(或 MariaDB)并提供基于此 post 的示例。

我们将使用 MySQL 函数YEARWEEK()。为此,将创建一个继承自 Func 的 python 类:

from django.db.models import Func, IntegerField

class YearWeek(Func):
    function = 'YEARWEEK'
    template = '%(function)s(%(expressions)s)'
    output_field = IntegerField()

现在我们可以这样查询:

from django.db.models import Count
from yourapp.models import tbl_data
from yourapp.filewhityearweek import YearWeek

result = tbl_data.objects.annotate(  
    yearweek=YearWeek('date')
).values('yearweek').annotate(
    count=Count('date')
).order_by('yearweek')

这将返回如下内容:

<QuerySet ['yearweek': 201801, 'count': 5, 'yearweek': 201802, 'count': 3, 'yearweek': 201803, 'count': 2]>

根据您的数据,结果肯定会有所不同。

Django ORM 生成的 SQL 查询将如下所示:

SELECT
    YEARWEEK('tbl_data'.'date') AS 'yearweek',
    COUNT('tbl_data'.'date') AS 'count'
FROM 'tbl_data'
    GROUP BY YEARWEEK('tbl_data'.'date')
    ORDER BY 'yearweek' ASC

这应该可以帮助您按日历周对条目进行分组。使用YEARWEEK 应该比WEEK 等函数提供更好的概览,因为它会返回年份和日历周。

【讨论】:

嘿,很有帮助,非常感谢!一个问题,在这个日期的情况下:2017-12-31 它返回 201753。是否有可能将公式转换为这样的代码? : YEARWEEK(ADDDATE(my_date,5-DAYOFWEEK(my_date)),3) 或 DATE_FORMAT(ADDDATE(my_date,5-DAYOFWEEK(my_date)),'%x-%v') 真的很感激。是的,我正在使用 mysql 函数YEARWEEK 接受一个可选的第二个参数mode。请查看documentation。您可以使用它并调整许多事情,例如周日或周一是一周的开始日及以后。

以上是关于如何使用 Django ORM 按周分组的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 EF Core 按周 对数据分组?

如何在打字稿/离子2中按周分组时间戳?

Django ORM如何获取按字段分组的原始值

按周分组,如何获得空周?

如何在 MySQL 中按周分组?

Django ORM,group_by 按所有值分组