2016-06-23 60 views
0

我一直模型看起来像这样的一周汇总查询集:Django的 - 在今年

class TestData(models.Model): 
    name = models.CharField(max_length=255) 
    one_value = models.IntegerField() 
    second_value = models.IntegerField() 
    create_at = models.DateTimeField() 

什么办法容易产生总和值的查询集为一年中的每一周? Django的1.9,Python 3中

+0

你如何定义一个星期?你有什么尝试? – Sayse

+0

@Sayse我自己的解决方案非常难看。我创建了额外的列“星期”,并做了一年,一周,_ = create_at.isocalendar()。它的工作,但我从这部分代码并不感到自豪。 – Xezeqeel

回答

2
from django.db.models import Func, F, Sum 

class Week(Func): 
    def as_mysql(self, compiler, connection): 
     self.function = 'WEEK' 
     return super().as_sql(compiler, connection) 

data = (TestData.objects 
     .filter(create_at__year=year) 
     .annotate(week=Week('create_at', output_field=IntegerField())) 
     .values('week') 
     .annotate(Sum('one_value'))) 

或者Sum(F('one_value') + F('second_value')),取决于你想要得到什么总和。

+1

我从来不使用Func。你能告诉我为什么当我尝试打印(数据)我得到“django.db.utils.OperationalError:没有这样的功能:无” – Xezeqeel

+0

@Xezeqeel你使用什么数据库? –

+0

它适合我这样的代码结束:return super(Week,self).as_sql(compiler,connection) –

1

这对我有用。来自弗拉基米尔达尼洛夫的解决方案。

+0

'WeekFunc'或'Week'? – LShi

+0

@LShi你可以将它命名,只要self.function是'WEEK' – zubhav