Foros del Web » Programando para Internet » Python »

[Django] Crear notificación al guardar objeto en la DB

Estas en el tema de [Django] Crear notificación al guardar objeto en la DB en el foro de Python en Foros del Web. Buenas noches amigos. Tengo una serie de models y necesito que al insertarlos en la DB (o sea, sólo la primera vez) se cree y ...
  #1 (permalink)  
Antiguo 17/05/2012, 15:20
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 14 años, 5 meses
Puntos: 310
[Django] Crear notificación al guardar objeto en la DB

Buenas noches amigos. Tengo una serie de models y necesito que al insertarlos en la DB (o sea, sólo la primera vez) se cree y guarde una instancia de otro modelo llamado Notification. Lo estoy haciendo así:
Código Python:
Ver original
  1. class Modelo(models.Model):
  2.    def __init__(self, *args, **kwargs):        
  3.        super(Modelo, self).__init__(*args, **kwargs)
  4.        
  5.        Notification.objects.create(foo=foo, bar=bar)
Sin embargo esto crearía una notificación cada vez que instanciara la clase Modelo, y yo sólo quiero que lo haga cuando lo inserto en la DB. ¿Cómo puedo hacerlo? Pensé en sobrescribir save, pero estaría en las mismas porque cada vez que llamara a save crearía una nueva notificación.
Gracias de antemano y saludos :D
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #2 (permalink)  
Antiguo 18/05/2012, 00:12
 
Fecha de Ingreso: octubre-2010
Mensajes: 83
Antigüedad: 14 años
Puntos: 4
Respuesta: [Django] Crear notificación al guardar objeto en la DB

Estas cerca pero en lugar de sobreescribir __init__ save es lo que debes sobreescribir.

Mas o menos seria asi:
Código:
class Foo....
    def save(self, *args, **kwargs):
        if not self.pk:
            Notification.objects.create(foo=foo, bar=bar)
        super...
Ya con eso te puedes dar la idea, ya tu ve si lo quieres poner antes o despues de guardar.

Ah me olvidaba, tambien podrias ver los signals quizas te sirva en lo que planees luego.
  #3 (permalink)  
Antiguo 18/05/2012, 09:11
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: [Django] Crear notificación al guardar objeto en la DB

De hecho, el camino mas sencillo sería crear un trigger en la base de datos.

Así no solo sirve con save si no con los datos insertados manualmente en la base de datos.
  #4 (permalink)  
Antiguo 19/05/2012, 17:23
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 14 años, 5 meses
Puntos: 310
Respuesta: [Django] Crear notificación al guardar objeto en la DB

Gracias a los dos por vuestras respuestas. Al final me he decantado por la solución de @snahor_ pero modificándola un poco para acomodarse a mis necesidades. Dejo la solución:
Código Python:
Ver original
  1. class Insert():
  2.     '''
  3.    Abstract class for models which need to do some stuff when are created, but only then (INSERT)
  4.    '''
  5.    
  6.     def save(self, *args, **kwargs):
  7.         exists = self.pk
  8.         models.Model.save(self, *args, **kwargs) # since we can't use super, use models.Model.save directly
  9.                                                 # and pass it <self> (Model inherits from models.Model)
  10.        
  11.         if self.__insert__ and not exists:
  12.             self.__insert__(*args, **kwargs)
  13.        
  14.         models.Model.save(self) # save it again to keep the __insert__ changes
  15.  
  16. class Foo(Insert, models.Model):
  17.     pass
Saludos (:
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red

Etiquetas: notificación, objeto
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:41.