Veo que puedo anular o definir pre_save, save, post_save
para hacer lo que quiero cuando se guarda una instancia de modelo.
¿Cuál se prefiere en qué situación y por qué?
Haré mi mejor esfuerzo para explicarlo con un ejemplo:
pre_save
y post_save
son señales que envía el modelo. En palabras más simples, se llama a las acciones a tomar antes o después de save
el modelo.
Un save
activa los siguientes pasos.
Django proporciona una manera de anular estas señales.
Ahora,
pre_save
señal de pre_save
se puede anular para algún procesamiento antes de que ocurra el guardado real en la base de datos. Ejemplo: (No sé un buen ejemplo de dónde sería ideal pre_save
en la parte superior de mi cabeza)
Digamos que tiene un ModelA
que almacena referencias a todos los objetos de ModelB
que aún no se han editado. Para esto, puede registrar una señal de pre_save
para notificar a ModelA
justo antes de que se ModelB
al método de save
ModelB
(Nada le impide registrar una señal de post_save
aquí también).
Ahora, el método de save
(no es una señal) del modelo se llama: de forma predeterminada, cada modelo tiene un método de save
, pero puede anularlo:
class ModelB(models.Model): def save(self): #do some custom processing here: Example: convert Image resolution to a normalized value super(ModelB, self).save()
Luego, puede registrar la señal post_save
(Esto es más usado que pre_save
)
Un caso de uso común es la creación de objetos UserProfile
cuando se crea un objeto User
en el sistema.
Puede registrar una señal post_save
que crea un objeto UserProfile
que corresponde a cada User
en el sistema.
Las señales son una forma de mantener las cosas modulares y explícitas. (Notifique explícitamente a ModelA
si ModelA
o cambio algo en ModelB
)
Pensaré en ejemplos más concretos del mundo real en un bash de responder mejor a esta pregunta. Mientras tanto, espero que esto te ayude.
pre_save
se utiliza antes de guardar la transacción.
post_save
se utiliza después de guardar la transacción.
Puede usar pre_save
por ejemplo, si tiene un FileField
o un ImageField
y ver si el file
o la image
realmente existe.
Puede usar post_save
cuando tenga un User
y desea crear uno nuevo en el momento en que se crea un nuevo User
.
No te olvides del riesgo de recursiones. Si usa el método post_save con la instancia instance.save () , en lugar del método .update, debe desconectar su señal de post_save :
Signal.disconnect (receptor = Ninguno, remitente = Ninguno, dispatch_uid = Ninguno) [fuente] Para desconectar un receptor de una señal, llame a Signal.disconnect (). Los argumentos son como se describen en Signal.connect (). El método devuelve True si se desconectó un receptor y False si no lo está.
El argumento del receptor indica el receptor registrado para desconectar. Puede ser Ninguno si dispatch_uid se utiliza para identificar al receptor.
… y conectarlo de nuevo después.
El método update () no envía señales pre_ y post_, tenlo en cuenta.