python - and - Señal de pre_save de Django: verifique si la instancia no se ha actualizado, ¿existe kwargs[''creado''](todavía)?
kwargs python 3 (4)
Estoy usando la señal de pre_save de Django para implementar auto_now_add. Hay mucha discusión en Internet sobre por qué debería o no debería implementarla usted mismo. No aprecio los comentarios sobre esto. Tampoco sé si debo reescribir la función de guardar (tengo muchos modelos que usan auto_now_add, por lo que usar señales tiene sentido).
Mi pregunta es:
Me gustaría comprobar si la instancia está creada o actualizada. Según algunas fuentes en Internet, esto se puede hacer comprobando si kwargs[''created'']
es Verdadero. Sin embargo, ''created''
no aparece en mis kwargs
aunque la instancia se haya creado recientemente. Me preguntaba si alguna vez ha existido o si ha desaparecido mágicamente. Sé que también podría probar si kwargs[''instance''].id
está establecido (esto, de hecho, funciona para mí), pero me gustaría saber si kwargs [''creado''] todavía existe.
Atributo de clave principal generalmente asignado por la base de datos cuando la instancia se guarda por primera vez. Así que puedes usar algo como if instance.pk is None
De acuerdo con la documentation más reciente de Django, pre_save
NO envía un argumento created
. Post_save
embargo, Post_save
does . No pude encontrar ninguna referencia del envío de señales created
desde la versión 1.0 .
El uso de instance._state.adding es el enfoque más lógico, ya que podrá decir que el estado del modelo existe o es nuevo, independientemente de si la clave principal se asignó o no.
No estoy seguro de si esta es la forma recomendada, pero el método de @Radagast no funcionó para mí (no estoy seguro de que sea porque uso Pk personalizados).
Intenté lo siguiente (no estoy seguro si esta es la mejor manera):
@receiver(pre_save, sender=YourModelName, weak=False, )
def presave_payment_model_check(sender, instance=None, created=False, **kwargs):
#Reference: https://.com/questions/11561722/django-what-is-the-role-of-modelstate
if instance._state.adding is True:
# we would need to create the object
print "Creating an object"
else:
#we are updating the object
print "Updating an object"
Referencia: Django: ¿Cuál es el papel de ModelState?