3

我有带有 City 和 Age 字段的 People 模型。我需要计算每个城市的人数,按 3 个不同的年龄范围 < 20、20 到 50 和 > 50 进行细分。我需要在一个 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 回答