2012-10-18 93 views
3

我有人與城市和年齡字段模型。 我需要計算每個城市的人數,分爲3個不同的年齡段< 20,介於20到50和> 50之間。我需要在一個SQL查詢中執行此操作。Django通過額外選擇的計算字段進行註釋

People.objects.extra(select={'young':'if(age < 20, 1, 0)', 
          'med':'if (age > 20 and age < 50, 1, 0)', 
          'old':'if (age > 50, 1, 0)'}).\ 
          values('city').\ 
          annotate(sum_young=Sum('young'), 
             sum_med=Sum('med'), 
             sum_old=Sum('old')) 

這是行不通的,似乎註釋不能通過計算字段來完成。

僅MySQL解決方案就夠了。

回答

1

是不幸的批註不計算價值的工作,但你可以做這樣的事情來實現你想要的:

objects = People.objects.extra(select={'young':'if(age < 20, 1, 0)', 
             'med':'if (age > 20 and age < 50, 1, 0)', 
             'old':'if (age > 50, 1, 0)'}) 
d = {} 
for obj in objects: 
    if not d.get(obj.city): 
     d[obj.city] = {'young': 0, 'med': 0, 'old': 0, objects=[]} 
    d[obj.city]['objects'].append(obj) 
    if obj.young: 
     d[obj.city]['young'] += 1 
    elif obj.med: 
     d[obj.city]['med'] += 1 
    elif obj.old: 
     d[obj.city]['old'] += 1 

然後在d字典你有城市作爲鍵,然後你年輕,中值,城市的舊計數和模型對象。