2016-06-23 59 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