Django cuenta objetos relacionados

¿Cómo puedo contar objetos relacionados en Django (en menos de N consultas, donde N es el número de objeto)?

Para aclarar, digamos que tengo las tablas A y B. Cada B está conectado exactamente a una A. Enfoque lo intenté:

A.objects.select_related().filter(attr=val) A[i].B_set.count() 

Por supuesto, para cada A [i] quiero averiguar la cantidad de objetos B que Django ejecuta una consulta.

Entonces la pregunta es: ¿hay una manera de optimizar eso?

No he intentado cuántas consultas se ejecutan, pero la forma de Django debería ser usar annotate() . Por ejemplo:

 from django.db.models import Count q = A.objects.select_related('B').annotate(num_B=Count('B')) print A[0].num_B 

Tengo que responder mi propia pregunta 🙂 Si se consulta el objeto de A, algo como esto:

 A.objects.select_related().filter(atrr=val).annotate(n_b=models.Count('B')) 

Esto crea una consulta muy larga, pero al menos solo hay una.

Dado que la función agregada Django 2.0 Count() acepta el parámetro de filter , lo que permite aplicar restricciones adicionales en el conjunto de objetos relacionados. Funciona así:

 A.objects.select_related().annotate( total=models.Count('myrelated__pk', filter=Q(only_items='that-i-need')) ).all()