[pyar] [django] Duda con signals y m2m

Alessandro Odetti aodetti en gmail.com
Mie Oct 12 09:23:01 ART 2016


Porque siguiendo este ejemplo:

>>> a2 = Article(headline='NASA uses Python')
>>> a2.save()
>>> a2.publications.add(p1, p2)
>>> a2.publications.add(p3)

Y si no entendi mal tu explicacion, las ultimas lineas son opcionales para
vos, dependiendo si tienen o o no categorias...
Yo al menos no veo una solución en la que puedas saber si llegaste al fin
de la "creacion" del objeto sin encapsular comportamiento

El 12 de octubre de 2016, 9:18, Varela Matias <matu.varela en gmail.com>
escribió:

> Gracias por tu respuesta.
>
> No entiendo porque me decis que guardo más de una vez? ¿que me estoy
> perdiendo?
>
> Añadir las relaciones usando un método aparte implica modificar varias
> cosas que django ya trae armadas, y además modificar el guardado en el
> admin de django. Creo que debería haber un modo de hacerlo sin tanta
> customización, después de todo, no es tan loco lo que necesito hacer.
>
>
> El mié., 12 oct. 2016 a las 9:02, Alessandro Odetti (<aodetti en gmail.com>)
> escribió:
>
>> pdta: creo que desde el punto de vista de diseño de objetos esta es la
>> solución correcta, ya que encapsula el comportamiento, quien lo usa no sabe
>> ni le interesa como está implementado por dentro, si es un m2m u otra cosa
>>
>> El 12 de octubre de 2016, 8:53, Alessandro Odetti <aodetti en gmail.com>
>> escribió:
>>
>>
>> Desde mi punto de vista, no estas realmente pidiendo eso, pq estas
>> haciendo save() mas de una vez, por lo tanto no creo que encuentres una
>> forma muy prolija...
>> Yo lo que haria es separar un método para agregar solo las relaciones en
>> vez de usar directamente el add del field m2m, y que se ejecute con una
>> lista o queryset vacio si no tiene nada para agregar (pero este metodo se
>> ejecuta igual cuando no hay categorias por agregar, no como con m2m.add
>> !!).
>> Entonces quedaría algo como esto:
>>
>> Class ModelLoco():
>>     def agregarCats(cats_a_agregar):
>>         if cats_a_agregar:
>>             #agrego al m2m
>>         # en esta parte ejecuto la parte de notificationes, notificando a
>> quien corresponda, segun las cats o no que tenga
>>
>>
>> El 12 de octubre de 2016, 8:46, Varela Matias <matu.varela en gmail.com>
>> escribió:
>>
>> @Juan, pinta lindo, pero no viene las 'areas' seleccionadas en el kwargs
>> del save. Creo que el save no es el lugar para ejecutar la notificación ya
>> que no tengo "todo" guardado (respecto a las m2m)
>>
>> @Daniel
>> "-si puede NO tener relaciones mediante ese m2m ¿cómo se relacionarían
>> para hacer algo con él? (o si es en el modelo "padre" ¿no te sirve el
>> post_save?)"
>> El post_save no sirve porque en ese momento, "no sé" si seleccionó o no
>> algún 'área' (el modelo m2m), y por lo tanto no puedo llamar al método
>> porque me falta información. ¿me explico? Ese método (una notificación)
>> TIENE que saber si se seleccionaron áreas o no.
>>
>> "-Si las tiene -las crea- ¿porqué no se dispara m2m_changed?"
>> Si se dispara cuando se han seleccionado elementos relacionados m2m, el
>> problema es cuando NO se ha hecho, ya que igualmente se debe ejecutar ese
>> método.
>>
>> @Ezequiel esto es lo que terminé haciendo ayer, pero como bien decis, no
>> estoy convencido de que sea la mejor opción.
>>
>> Basicamente, busco la respuesta a:
>> Ok django, necesito que me avises cuando hayas guardado el modelo, sus
>> relaciones y TODO, así hago esto que necesito hacer!
>>
>> Saludos
>>
>> El mié., 12 oct. 2016 a las 7:41, Ezequiel Golub (<
>> ezequiel.golub en gmail.com>) escribió:
>>
>> Lo que hice para un proyecto chico es tener una tarea en celery con
>> countdown de 30 segundos, disparada por el post_save. Es medio sucio, y si
>> fuera a tener mucho tráfico cada formulario seguro voy a tener problemas
>> pero necesitaba solucionarlo rápido. Lo que hace esto es demorar la
>> ejecución por 30 segundos, lo cual le da tiempo a Django de terminar de
>> guardar todo, entonces vos volves a interrogar la bbdd para ver el nuevo
>> estado y ahí decidís que hacer. También podes hookear el pre_save, guardar
>> el estado anterior y pasárselo al task de celery para poder inspeccionar
>> los cambios.
>> Lo use para mandar un resumen de "usuarios asignados y desafinados" a
>> cierto proyecto.
>>
>> Abz
>>
>> Eze
>> El El mar, 11 de oct. de 2016 a las 16:27, Daniel <
>> dmlistapython en gmail.com> escribió:
>>
>>
>> Buenas, tengo este problema:
>>
>> Necesito llamar a un método de un modelo de django luego de que este se
>> guarda. Este modelo tiene un m2m a otro, por lo que bindee al signal
>> m2m_changed para que se ejecute ese método (el post_save no me sirve porque
>> aún no tiene las relaciones m2m guardadas)
>>
>> El tema es que puede no tener relaciones mediente ese m2m, por lo que
>> ese signal nunca se dispara.
>>
>> Se me ocurrió añadir un task en celery para que ejecute ese método luego
>> de que todo está guardado, y creo que funcionaría, pero quizás habia alguna
>> forma de hacer esto sin celery.
>>
>> ¿Hay manera de llamar a un método luego de que TODO es salvado en la db?
>> ¿se les ocurre otra forma más "djangera" de hacer esto?
>>
>> Saludos y gracias de antemano
>>
>>
>> No termino de entender el problema
>> -si puede NO tener relaciones mediante ese m2m ¿cómo se relacionarían
>> para hacer algo con él? (o si es en el modelo "padre" ¿no te sirve el
>> post_save?)
>> -Si las tiene -las crea- ¿porqué no se dispara m2m_changed?
>>
>>
>> _______________________________________________
>> pyar mailing list pyar en python.org.ar
>> http://listas.python.org.ar/listinfo/pyar
>>
>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>>
>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>> Argentina - http://www.usla.org.ar
>>
>> _______________________________________________
>> pyar mailing list pyar en python.org.ar
>> http://listas.python.org.ar/listinfo/pyar
>>
>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>>
>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>> Argentina - http://www.usla.org.ar
>>
>>
>> _______________________________________________
>> pyar mailing list pyar en python.org.ar
>> http://listas.python.org.ar/listinfo/pyar
>>
>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>>
>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>> Argentina - http://www.usla.org.ar
>>
>>
>>
>>
>> --
>> *- Alessandro Odetti -   *
>>
>> El 12 de octubre de 2016, 8:46, Varela Matias <matu.varela en gmail.com>
>> escribió:
>>
>> @Juan, pinta lindo, pero no viene las 'areas' seleccionadas en el kwargs
>> del save. Creo que el save no es el lugar para ejecutar la notificación ya
>> que no tengo "todo" guardado (respecto a las m2m)
>>
>> @Daniel
>> "-si puede NO tener relaciones mediante ese m2m ¿cómo se relacionarían
>> para hacer algo con él? (o si es en el modelo "padre" ¿no te sirve el
>> post_save?)"
>> El post_save no sirve porque en ese momento, "no sé" si seleccionó o no
>> algún 'área' (el modelo m2m), y por lo tanto no puedo llamar al método
>> porque me falta información. ¿me explico? Ese método (una notificación)
>> TIENE que saber si se seleccionaron áreas o no.
>>
>> "-Si las tiene -las crea- ¿porqué no se dispara m2m_changed?"
>> Si se dispara cuando se han seleccionado elementos relacionados m2m, el
>> problema es cuando NO se ha hecho, ya que igualmente se debe ejecutar ese
>> método.
>>
>> @Ezequiel esto es lo que terminé haciendo ayer, pero como bien decis, no
>> estoy convencido de que sea la mejor opción.
>>
>> Basicamente, busco la respuesta a:
>> Ok django, necesito que me avises cuando hayas guardado el modelo, sus
>> relaciones y TODO, así hago esto que necesito hacer!
>>
>> Saludos
>>
>> El mié., 12 oct. 2016 a las 7:41, Ezequiel Golub (<
>> ezequiel.golub en gmail.com>) escribió:
>>
>> Lo que hice para un proyecto chico es tener una tarea en celery con
>> countdown de 30 segundos, disparada por el post_save. Es medio sucio, y si
>> fuera a tener mucho tráfico cada formulario seguro voy a tener problemas
>> pero necesitaba solucionarlo rápido. Lo que hace esto es demorar la
>> ejecución por 30 segundos, lo cual le da tiempo a Django de terminar de
>> guardar todo, entonces vos volves a interrogar la bbdd para ver el nuevo
>> estado y ahí decidís que hacer. También podes hookear el pre_save, guardar
>> el estado anterior y pasárselo al task de celery para poder inspeccionar
>> los cambios.
>> Lo use para mandar un resumen de "usuarios asignados y desafinados" a
>> cierto proyecto.
>>
>> Abz
>>
>> Eze
>> El El mar, 11 de oct. de 2016 a las 16:27, Daniel <
>> dmlistapython en gmail.com> escribió:
>>
>>
>> Buenas, tengo este problema:
>>
>> Necesito llamar a un método de un modelo de django luego de que este se
>> guarda. Este modelo tiene un m2m a otro, por lo que bindee al signal
>> m2m_changed para que se ejecute ese método (el post_save no me sirve porque
>> aún no tiene las relaciones m2m guardadas)
>>
>> El tema es que puede no tener relaciones mediente ese m2m, por lo que
>> ese signal nunca se dispara.
>>
>> Se me ocurrió añadir un task en celery para que ejecute ese método luego
>> de que todo está guardado, y creo que funcionaría, pero quizás habia alguna
>> forma de hacer esto sin celery.
>>
>> ¿Hay manera de llamar a un método luego de que TODO es salvado en la db?
>> ¿se les ocurre otra forma más "djangera" de hacer esto?
>>
>> Saludos y gracias de antemano
>>
>>
>> No termino de entender el problema
>> -si puede NO tener relaciones mediante ese m2m ¿cómo se relacionarían
>> para hacer algo con él? (o si es en el modelo "padre" ¿no te sirve el
>> post_save?)
>> -Si las tiene -las crea- ¿porqué no se dispara m2m_changed?
>>
>>
>> _______________________________________________
>> pyar mailing list pyar en python.org.ar
>> http://listas.python.org.ar/listinfo/pyar
>>
>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>>
>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>> Argentina - http://www.usla.org.ar
>>
>> _______________________________________________
>> pyar mailing list pyar en python.org.ar
>> http://listas.python.org.ar/listinfo/pyar
>>
>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>>
>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>> Argentina - http://www.usla.org.ar
>>
>>
>> _______________________________________________
>> pyar mailing list pyar en python.org.ar
>> http://listas.python.org.ar/listinfo/pyar
>>
>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>>
>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>> Argentina - http://www.usla.org.ar
>>
>>
>>
>>
>> --
>> *- Alessandro Odetti -   *
>>
>>
>>
>>
>> --
>> *- Alessandro Odetti -   *
>> _______________________________________________
>> pyar mailing list pyar en python.org.ar
>> http://listas.python.org.ar/listinfo/pyar
>>
>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>>
>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>> Argentina - http://www.usla.org.ar
>
>
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
>



-- 
*- Alessandro Odetti -   *
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20161012/854a4197/attachment-0001.html>


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