2014-06-29 37 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']