2012-11-01 50 views
1

模型,用抽象基類:Django的合計值

class MapObject(models.Model): 
    start_date = models.DateTimeField(default= datetime.strptime('1940-09-01T00:00:00', '%Y-%m-%dT%H:%M:%S')) 
    end_date = models.DateTimeField(default= datetime.strptime('1941-07-01T00:00:00', '%Y-%m-%dT%H:%M:%S')) 
    description = models.TextField(blank=True) 
    location = models.PointField() 
    objects = models.GeoManager() 
    user = models.ForeignKey(User) 
    created = models.DateTimeField(auto_now_add = True) 
    last_modified = models.DateTimeField(auto_now = True) 
    source = models.ForeignKey(Source) 
    address= models.TextField(blank=True, null=True) 
    address_road = models.TextField(blank=True, null=True) 

class Meta: 
    abstract = True 

class Bomb(MapObject, BombExtraManager): 
    #Bomb Attributes 
    type = models.CharField(choices= Type_CHOICES, max_length=10) 
    night_bombing = models.BooleanField(blank=True) 
    map_sheet = models.ForeignKey(MapSheet, blank=True, null=True) 
    def __unicode__(self): 
     return self.type 

現在,我想使用Django ORM作爲此查詢的結果相當於:

Select date_part('day',"start_date") as "day", date_part('hour',"start_date") as "hour", Count('id') 
from "Mapper_bomb" 
where "source_id" = 1 
group by date_part('hour',"start_date"), date_part('day',"start_date") 
Order by date_part('day',"start_date") ASC, date_part('hour',"start_date") ASC 

這將使我一張桌子上有每天和每小時的炸彈數量。

使用Django ORM,我來的那一刻以下(FIRST_DAY就是我定義的自定義管理器,返回數據的一個子集,同SOURCE_ID = 1):

Bomb.first_day.extra(select={'date': "date_part(\'day\', \"start_date\")", 'hour': "date_part(\'hour\', \"start_date\")"}).values('date', 'hour').order_by().annotate(Count('date'), Count('hour')) 

不過在Django抱怨FieldError:無法將關鍵字'日期'解析爲字段。有沒有一種方法使用Django ORM來獲得所需的結果,還是我需要回退原始SQL?

回答

7

這是行不通的?

Bomb.first_day.extra({ 
     'date': "date_part(\'day\', \"start_date\")", 
     'hour': "date_part(\'hour\', \"start_date\")" 
    }).values('date', 'hour').order_by('date', 'hour').annotate(Count('id')) 
+0

哇,那有效,太好了!儘管如此,從Django文檔我收集你需要設置額外的字段爲選擇= ...,你還沒有在這裏做?不知道這是什麼意思... – petzlux

+0

第一個參數是'select',無論你是否命名。 –

+3

這在Django 1.5中不起作用。它是從哪裏加入的? 'User.objects.extra({'started':'1'})。values('started')。order_by('started')。annotate(Count('started'))'給出'FieldError:無法解析關鍵字'開始「進場」 – qris