如何使用Django ORM按周分组

问题描述 投票:1回答:1

我使用以下SQL代码检查以前的星期日:

DATE_ADD(tbl.date,INTERVAL( - 1)* DAYOFWEEK(tbl.date)+ 1天)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 )

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

提前致谢,

python django python-2.7 django-models django-orm
1个回答
0
投票

您没有说明您正在使用哪个数据库系统,但我认为它是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这样的函数给你更好的概述,因为它返回了年份和日历周。

© www.soinside.com 2019 - 2024. All rights reserved.