如何GROUP BY和Django的骨料(How to group by AND aggregate

2019-06-21 04:32发布

我有一个相当简单的查询,我想通过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宁愿去保持一致性。

谢谢

Answer 1:

试试这个:

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


Answer 2:

你可以试试这个。

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


文章来源: How to group by AND aggregate with Django