如何通过AND聚合与Django分组

时间:2012-11-15 18:12:24

标签: django django-aggregation

我有一个相当简单的查询,我想通过ORM进行,但无法弄清楚..

我有三种模式:

位置(地点),属性(地点可能具有的属性)和评级(包含分数字段的M2M'到'模型)

我想选择一些重要的属性,并能够按照这些属性对我的位置进行排名 - 即所有选定属性的总分更高=更好。

我可以使用以下SQL来获得我想要的东西:

select location_id, sum(score) 
    from locations_rating 
    where attribute_id in (1,2,3) 
    group by location_id order by sum desc;

返回

 location_id | sum 
-------------+-----
          21 |  12
           3 |  11

我最接近ORM的是:

Rating.objects.filter(
    attribute__in=attributes).annotate(
    acount=Count('location')).aggregate(Sum('score'))

返回

{'score__sum': 23}

即。所有的总和,不按地点分组。

有什么方法吗?我可以手动执行SQL,但宁可通过ORM来保持一致。

由于

2 个答案:

答案 0 :(得分:116)

试试这个:

Rating.objects.filter(attribute__in=attributes) \
    .values('location') \
    .annotate(score = Sum('score')) \
    .order_by('-score')

答案 1 :(得分:37)

你能试试吗?

Rating.objects.values('location_id').filter(attribute__in=attributes).annotate(sum_score=Sum('score')).