如何通过AND聚合与Django分组

Guy*_*den 73 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;
Run Code Online (Sandbox Code Playgroud)

返回

 location_id | sum 
-------------+-----
          21 |  12
           3 |  11
Run Code Online (Sandbox Code Playgroud)

我能用ORM得到的最接近的是:

Rating.objects.filter(
    attribute__in=attributes).annotate(
    acount=Count('location')).aggregate(Sum('score'))
Run Code Online (Sandbox Code Playgroud)

哪个回报

{'score__sum': 23}
Run Code Online (Sandbox Code Playgroud)

即所有的总和,不按位置分组.

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

谢谢

Aam*_*nan 126

试试这个:

Rating.objects.filter(attribute__in=attributes) \
    .values('location') \
    .annotate(score = Sum('score')) \
    .order_by('-score')
Run Code Online (Sandbox Code Playgroud)

  • `aggregate`用于完整的结果集,`annotate`用于单个(分组)行. (49认同)
  • 嗯 - 注释不是聚合 - 为什么? (3认同)

Sri*_*thy 38

你能试试吗?

Rating.objects.values('location_id').filter(attribute__in=attributes).annotate(sum_score=Sum('score')).
Run Code Online (Sandbox Code Playgroud)