Tengo dos tablas. Tablas de plantillas y rastreadores. con una relación de uno a muchos. necesito mostrar todas las plantillas cargadas para un usuario en particular. También necesito hacer un pedido con el recuento de descargas.
Intenté la siguiente consulta. pero no obtiene el recuento de todas las descargas.
Template.objects.filter(tracker__type='upload', user_id=300).annotate( download_count=Count( 'tracker', filter=Q(tracker__type='download') ) ).order_by("-download_count")Tabla de plantillas
| identificación | título | descripción |
|---|---|---|
| 1 | AAA | AAA |
| 2 | AAA | AAA |
| 3 | AAA | AAA |
Tabla de seguimiento
| identificación | tipo | id_usuario | template_id |
|---|---|---|---|
| 1 | descargar | 100 | 1 |
| 2 | descargar | 200 | 1 |
| 3 | subir | 300 | 1 |
Puede filtrar con una subconsulta Exists [Django-doc] y luego anotar las Template :
from django.db.models import Count, Exists, OuterRef Template.objects.filter( Exists( Tracker.objects.filter( template_id=OuterRef('pk') , user_id=300, tracker_type='upload' ) ) ).annotate( total_downloads=Count('tracker', filter=Q(tracker__type='download')) ).order_by('-total_downloads') Esto devolverá un QuerySet de Template que ha cargado un usuario con la clave principal 300 y estos objetos Template contendrán un atributo adicional .total_downloads que enumerará el número de descargas para esa Template .