У меня есть довольно простой запрос, который я хотел бы сделать через 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, чтобы все было согласовано.
благодаря
django
django-aggregation
Гай Боуден
источник
источник
Ответы:
Попробуй это:
Rating.objects.filter(attribute__in=attributes) \ .values('location') \ .annotate(score = Sum('score')) \ .order_by('-score')
источник
aggregate
предназначен для полного набора результатовannotate
для отдельных (сгруппированных) строк.'dict' object has no attribute '_meta'
с таким QuerySet?[{"location": 53, "score": 100}, {"location": 54, "score": 104}]
Вы можете попробовать это.
Rating.objects.values('location_id').filter(attribute__in=attributes).annotate(sum_score=Sum('score')).
источник