Django通过额外选择中的计算字段进行注释

时间:2012-10-18 10:34:56

标签: django django-queryset

我有人物模型与城市和年龄字段。 我需要将每个城市的人数统计为3个不同的年龄范围< 20,在20和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解决方案就足够了。

1 个答案:

答案 0 :(得分: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字典中,您将城市作为关键字,然后您就拥有该城市的年轻,中学,旧计数和模型对象。