[pyar] [django] incluyendo operaciones en la misma transacción

Maximiliano Robaina maxi_robaina en yahoo.com.ar
Mie Ene 5 12:24:36 ART 2011


Hola gente,

Bueno, no se si el subject es muy descriptivo al problema pero no se me
ocurrió otro.

<disclaimer>
Lo que expongo acá es a modo de ejemplo, pero es muy cercano a la
realidad y por lo tanto no lo probé por lo que puede haber errores
</disclaimer>

El tema es el siguiente:

Tengo un modelo 'Comprobante' el cual tiene un atributo 'estado' que
almacena un valor (int) correspondiente al estado actual del comprobante
(que es Fk con un modelo Estado). 

Por otro lado, tengo un modelo CbteEstados el cual va guardando el trace
de cada cambio de estado del comprobante.
Pasando en limpio sería algo así (solo a modo de ejemplo):

class Comprobante(models.Model):
	id 
        estado  (fk con estado) # estado actual del comprobante

class CbteEstados(models.Model)
      id
      cbte  (fk con Comprobante)
      estado (fk con Estado)


Ahora, cada vez que un comprobante cambia de estado, tengo que crear una
instancia (bueno, insertar un registro) en CbteEstados, por lo tanto
esta última relación me va manteniendo todos los cambios de estado del
cbte.

Entonces, si hago:

cbte = Comprobante()
cbte.estado = new_estado
cbte.save()

Cuando se hace el save() quiero que guarde el cambio en CbteEstados, por
la tanto lo primero que se me ocurre es sobreescribir el método save()
de Comprobante para allí insertar en CbteEstados.

# método save del modelo Comprobante
def save(self, force_insert=False, force_update=False):
	super(Comprobante, self).save(force_insert, force_update)
	ce = CbteEstados()
        ce.cbte = self
        ce.estado = self.estado
        ce.save()


Ahora, lo primero que veo es, el save() de CbteEstados ocurre en otra
transacción del save() de Comprobante ? Es así, no?

Podría usar el decorador @transaction para manejar yo la atomicidad de
la operación, pero es correcto usar esto en el save() de mi modelo ?

¿Hay alguna otra forma de manjar esto?


Bueno, se mi hizo demasiado largo el planteo del problema.
Espero haber sido claro.

Gracias de antemano.

Saludos.
---
Maxi















More information about the pyar mailing list