我有一个相当简单的查询,我想通过 ORM 进行,但无法弄清楚..
我有三个模型:
Location(一个地方)、Attribute(一个地方可能具有的属性)和 Rating(一个 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 来保持一致。
谢谢
最佳答案
试试这个:
Rating.objects.filter(attribute__in=attributes) \
.values('location') \
.annotate(score = Sum('score')) \
.order_by('-score')
关于django - 如何使用 Django 进行分组和聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13403609/