2014-06-29 41 views
1

我一直在努力尋找一種利用django的ORM進行日期範圍分組的好方法。我有一個用戶擁有一個出生日期字段,我想要將所有在10-15歲,15-20歲等範圍內的用戶分組,然後返回組和總數那個年齡段的人。Django ORM按出生日期分組

我的模型:

class Reader(models.Model): 
    user = models.OneToOneField(User) 
    birth_date = models.DateField() 

我原始的SQL是這樣的:

SELECT count(*) as total, 
    CASE 
    WHEN EXTRACT(year from AGE(NOW(), birth_date)) <= 10 THEN '1-10' 
    WHEN EXTRACT(year from AGE(NOW(), birth_date)) <= 15 THEN '11-15' 
    WHEN EXTRACT(year from AGE(NOW(), birth_date)) <= 20 THEN '16-20' 
    WHEN EXTRACT(year from AGE(NOW(), birth_date)) <= 25 THEN '21-25' 
    WHEN EXTRACT(year from AGE(NOW(), birth_date)) <= 30 THEN '26-30' 
    WHEN EXTRACT(year from AGE(NOW(), birth_date)) <= 40 THEN '31-40' 
    WHEN EXTRACT(year from AGE(NOW(), birth_date)) <= 50 THEN '41-50' 
    WHEN EXTRACT(year from AGE(NOW(), birth_date)) <= 60 THEN '51-60' 
    WHEN EXTRACT(year from AGE(NOW(), birth_date)) > 60 THEN '60+' 
    END as age 
    FROM main_reader AS reader 
    GROUP BY age 

回答

0

也許嘗試這樣的事情(未測試):

case_when_query = "(case when extract...end)" # Your case when query here 

extra_qs = Reader.objects.extra(select={'count': 'count(1)', 'age': case_when_query}) 

query_set = extra_qs.values('count', 'age') 
query_set.query.group_by = ['age']