如何使用 Django ORM 按周分组
How to group by week with Django ORM
我正在使用以下 SQL 代码来检查前一个星期日:
DATE_ADD(tbl.date, INTERVAL (- 1) * DAYOFWEEK(tbl.date) + 1 DAY) AS
week
你能告诉我是否可以使用 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 )
数据每天都在上传,我想按周分组(周日是我的第一天)
提前致谢,
您没有说明您使用的是哪个数据库系统,但我假设它是 MySQL(或 MariaDB)并提供基于此 的示例。
我们将使用 MySQL 函数 YEARWEEK()
。为此目的,将创建一个 python class 继承自 Func
:
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')
这将 return 像这样:
<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
这样的函数给你更好的概览,因为它是 return 年和日历周。
我正在使用以下 SQL 代码来检查前一个星期日:
DATE_ADD(tbl.date, INTERVAL (- 1) * DAYOFWEEK(tbl.date) + 1 DAY) AS week
你能告诉我是否可以使用 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 )
数据每天都在上传,我想按周分组(周日是我的第一天)
提前致谢,
您没有说明您使用的是哪个数据库系统,但我假设它是 MySQL(或 MariaDB)并提供基于此
我们将使用 MySQL 函数 YEARWEEK()
。为此目的,将创建一个 python class 继承自 Func
:
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')
这将 return 像这样:
<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
这样的函数给你更好的概览,因为它是 return 年和日历周。