3

City フィールドと Age フィールドを持つ People モデルがあります。20 歳未満、20 歳から 50 歳、50 歳以上の 3 つの異なる年齢範囲で区切られた各都市の人数を取得する必要があります。これを 1 つの SQL クエリで行う必要があります。

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 のみのソリューションで十分です。

4

1 に答える 1

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辞書にはキーとして都市があり、都市の若い、中、古いカウント、およびモデルオブジェクトがあります。

于 2013-01-12T14:16:05.260 に答える