sobre model validation:
Tenga en cuenta que full_clean() no se llamará automáticamente cuando se llama al método de su modelo, salvo()
Luego, sobre la pre-save signal
, tenga en cuenta que se obtiene la instancia que se está guardando enviado como un parámetro con el mensaje. Como la versión anterior de su modelo existe solo en la base de datos, no veo en qué otro lugar podría obtener el valor anterior de los atributos ...
No dice por qué quiere hacer esto, así que es difícil decirlo, pero otras soluciones que estoy pensando en este momento:
* defining a custom signal that is sent everytime the attributes you are interested in are modified... This signal would then send two arguments : new value, old value
* perform the check directly when setting the attributes
Si le das más detalles, podría ser más fácil ...
EDIT:
Así es ... Si usted emite un 'foo_has_updated' personalizado, no estará seguro de que la modificación se haya guardado.
En este caso, supongo que puede almacenar en caché las variables que le interesan al inicializar la instancia y capturar la señal de guardado o guardado previo.
* With pre-save, you would be able to pre-process the data, but the saving operation might fail
* With post-save, you would be sure that the data has been saved.
Almacenamiento en caché de las variables se podría hacer así:
class CachedModel(models.Model):
cached_vars = [var1, var2, varN]
def __init__(self, *args, **kwargs):
super(CachedModel, self).__init__(*args, **kwargs)
self.var_cache = {}
for var in self.cached_vars:
self.var_cache[var] = copy.copy(getattr(self, var))
O algo así ... Luego, en el manejador de la señal:
def post_save_handler(sender, **kwargs):
instance = kwargs["instance"]
[(instance.var_cache[var], getattr(instance, var)) for var in instance.cached_var]
#[(<initial value>, <saved value>)
Y tienes lo que necesitabas (Creo)!!!
Gracias por la respuesta. Específicamente, y aún bastante genéricamente, me gustaría saber cuándo se ha cambiado un campo en particular (un campo de elección, por ejemplo). Yendo más lejos, me gustaría hacer exactamente lo que dijiste, emitir una señal personalizada cuando esto ocurra. Volviendo a mi pregunta, cuando se actualiza un modelo, ¿cómo puedo comparar sus valores anteriores para enviar esta señal? (Si no se garantiza que el objeto se guarde antes de post_save, no parece correcto emitir una señal foo_has_updated, sin verificar ... pero esa es otra pregunta). –