我有人物模型与城市和年龄字段。 我需要将每个城市的人数统计为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解决方案就足够了。
答案 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
字典中,您将城市作为关键字,然后您就拥有该城市的年轻,中学,旧计数和模型对象。