tutorial - Cómo agrupar por AND agregado con Django
tutorial django (2)
Prueba esto:
Rating.objects.filter(attribute__in=attributes) /
.values(''location'') /
.annotate(score = Sum(''score'')) /
.order_by(''-score'')
Tengo una consulta bastante simple que me gustaría hacer a través de la ORM, pero no puedo resolverlo ...
Tengo tres modelos:
Ubicación (un lugar), Atributo (un atributo que un lugar podría tener) y Clasificación (un modelo M2M ''a'' que también contiene un campo de puntaje)
Quiero elegir algunos atributos importantes y poder clasificar mis ubicaciones según esos atributos, es decir, una puntuación total más alta sobre todos los atributos seleccionados = mejor.
Puedo usar el siguiente SQL para obtener lo que quiero:
select location_id, sum(score)
from locations_rating
where attribute_id in (1,2,3)
group by location_id order by sum desc;
que devuelve
location_id | sum
-------------+-----
21 | 12
3 | 11
Lo más cercano que puedo obtener con el ORM es:
Rating.objects.filter(
attribute__in=attributes).annotate(
acount=Count(''location'')).aggregate(Sum(''score''))
Que devuelve
{''score__sum'': 23}
es decir, la suma de todos, no agrupados por ubicación.
De cualquier forma alrededor de esto? Podría ejecutar el SQL manualmente, pero preferiría ir a través del ORM para mantener la coherencia.
Gracias
Puedes probar esto
Rating.objects.values(''location_id'').filter(attribute__in=attributes).annotate(sum_score=Sum(''score'')).