Tengo una lista de elementos que me gustaría clasificar según el recuento de muchos elementos relacionados. Creo que agregar los recuentos de esos elementos de origen es la forma correcta, pero aún no he encontrado una solución.
class Element(models.Model): Source1 = models.ManyToManyField(Source1) Source2 = models.ManyToManyField(Source2) Source3 = models.ManyToManyField(Source3) Ranked = (Element.objects.all().aggregate( Ranked=Sum(F('Source1') + F('Source2') + F('Source3'), output_field=IntegerField)['Ranked'] ))Una posible solución:
agg_data = Element.objects.aggregate(total_source1=Count('Source1'), total_source2=Count('Source2'), total_source3=Count('Source3')) total_count = sum(agg_data.values()) # this is value which you needActualización: si desea obtener una lista de elementos:
res = Element.objects.all().annotate(total_source1=Count('Source1'), total_source2=Count('Source2'), total_source3=Count('Source3')) .annotate(total_count=F('total_source1') + F('total_source2') + F('total_source3')).order_by('-total_count')