Подтвердить что ты не робот

Как группировать по AND с помощью Django

У меня есть довольно простой запрос, который я хотел бы сделать через 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, чтобы все было согласовано.

Спасибо

4b9b3361

Ответ 1

Попробуйте следующее:

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

Ответ 2

Можете ли вы попробовать это.

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