¿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()