[pyar] [Django] exclusion Related name

Daniel dmlistapython en gmail.com
Jue Nov 29 08:41:08 -03 2018


Respondo con la solución por si a alguien se enfrenta a algo similar
(Gracias Marcos!!!)

El mar., 27 nov. 2018 a las 22:48, marcos hipe (<marcoshipe en gmail.com>)
escribió:

> Si lo que queres hacer es obtener todos los libros que no tengan uno o mas
> Prestamo asociados, podes hacer:
> Libro.objects.filter(prestamos__isnull=True)
>
> Si lo que queres es obtener todos los que no tengan un prestamo "Activo"
> (o sea, que no haya sido devuelto), entonces:
> Libro.objects.\
>     annotate(prestamos_activos=Count('prestamos',
> filter=Q(prestamos__fecha_devuelto__isnull=True))).\
>     filter(prestamos_activos=0)
>
> para entender el annotate, lo que hace es agregar una columna (si lo vemos
> como tabla sql) o un campo (field), para cada fila (o objeto). Esta columna
> representa el numero de prestamos activos (o sea, que no fueron devueltos,
> o sea, que tienen fecha_devuelto = None). Despues podemos usar esa columna
> para filtrar, en este caso, queremos todos los libros que no tengan ningun
> prestamo_activo.
> Observacion: No lo probe, asi que puede haber algun error. y tambien
> podria pasar que los libros que no tienen prestamos, en vez de tener un 0
> en "prestamos_activos" tengan un None, si es asi, habria que agregar ese
> caso en el filtro (con un OR, asi que hay que usar el Q(...) | Q(...))
>

La solución que marcos propuso me anduvo a la perfección
*Libros disponibles:*
Libro.objects.annotate(prestamos_activos=Count('prestados',
filter=Q(prestados__fecha_devuelto__isnull=True)
    ...: )).filter(prestamos_activos=0)
*Libros Prestados:*
Libro.objects.annotate(prestamos_activos=Count('prestados',
filter=Q(prestados__fecha_devuelto__isnull=True)
    ...: )).filter(prestamos_activos__gt=0)

Estoy usando autocompletar, asi que le dejo tarea para otro probar el
*limit_choice_to*
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20181129/99bf0e03/attachment.html>


Más información sobre la lista de distribución pyar