¿Cuándo usar pre_save, save, post_save en django?

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.

  • Emite una señal de pre-guardado.
  • Preprocesar los datos.
  • La mayoría de los campos no procesan previamente, los datos de campo se mantienen tal como están.
  • Preparar los datos para la base de datos.
  • Insertar los datos en la base de datos.
  • Emitir una señal de guardado posterior.

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.