[pyar] [Django] exclusion Related name

marcos hipe marcoshipe en gmail.com
Mar Nov 27 22:47:43 -03 2018


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

El mar., 27 nov. 2018 a las 21:38, Daniel (<dmlistapython en gmail.com>)
escribió:

> Hola gente linda:
>
> Dado el modelo Prestamos, ¿cómo puedo hacer para que me limite la lista en
> el related name a los que NO estan en préstamos?  No se como usar
> Libro.prestados.all() porque tengo que buscar en todos los libros y no en
> uno. ¿alguna forma pythonezca que sugieran?
>
> class Prestamo(models.Model):
> """
> Registra cada evento de préstamo de libros
> """
> fecha_prestamo = models.DateTimeField(auto_now_add=True, verbose_name="Fecha
> de Retiro")
> persona = models.ForeignKey(Lector, on_delete=models.CASCADE)
> libro = models.ForeignKey(Libro, related_name="prestados", on_delete=
> models.CASCADE)
> fecha_devuelto = models.DateTimeField(blank=True, null=True, verbose_name="Fecha
> de Devolución")
> observaciones = models.TextField(blank=True, null=True)
> _______________________________________________
> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
> Sitio web: http://www.python.org.ar/
>
> Para administrar la lista (o desuscribirse) entrar a
> http://listas.python.org.ar/listinfo/pyar
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20181127/4e9d8b62/attachment.html>


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