Как группировать и агрегировать с Django



у меня есть довольно простой запрос, который я хотел бы сделать через ORM, но не могу понять этого..



у меня есть три модели:



местоположение (место), атрибут (атрибут, который может иметь место) и рейтинг (модель M2M' through', которая также содержит поле оценки)



Я хочу выбрать некоторые важные атрибуты и иметь возможность ранжировать мои местоположения по этим атрибутам - т. е. более высокий общий балл по всем выбранным атрибутам = лучше.



Я могу использовать после 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, чтобы все было согласовано.



спасибо

520   2  

2 ответов:

попробуйте это:

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

вы можете попробовать это.

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

Comments

    Ничего не найдено.