Quiero ejecutar algún código en un modelo Django cuando se crea por primera vez. Después de eso, cada vez que se guarda quiero ejecutar otro código. La segunda tarea se puede hacer fácilmente anulando el método save(). ¿Cómo puedo hacer la primera tarea?Ejecutar código en la creación del modelo en Django
6
A
Respuesta
9
Puede utilizar django signals 'post_save
:
# models.py
from django.db.models import signals
class MyModel(models.Model):
pass
def my_model_post_save(sender, instance, created, *args, **kwargs):
"""Argument explanation:
sender - The model class. (MyModel)
instance - The actual instance being saved.
created - Boolean; True if a new record was created.
*args, **kwargs - Capture the unneeded `raw` and `using`(1.3) arguments.
"""
if created:
# your code goes here
# django 1.3+
from django.dispatch import dispatcher
dispatcher.connect(my_model_post_save, signal=signals.post_save, sender=MyModel)
# django <1.3
from django.db.models.signals import post_save
post_save.connect(my_model_post_save, sender=MyModel)
21
Extendiendo sdolan' s answer utilizando receiver
decorador:
from django.db import models
from django.dispatch import receiver
class MyModel(models.Model):
pass
@receiver(models.signals.post_save, sender=MyModel)
def execute_after_save(sender, instance, created, *args, **kwargs):
if created:
# code
+2
Esto es lo que funciona ahora con django 1.10, en lugar de la respuesta aceptada que era presumiblemente correcta para versiones anteriores. – LisaD
Cuestiones relacionadas
- 1. Crear una instancia de OneToOne en la creación del modelo
- 2. Django: Establecer el widget predeterminado en la definición del modelo
- 3. Creación masiva de objetos de modelo en django
- 4. Django objeto de modelo con la creación de clave externa
- 5. cómo ejecutar este código en la plantilla de Django
- 6. Django - Crear perfil de usuario en la creación del usuario
- 7. campos del modelo dinámico Django
- 8. Django: permisos basados en la instancia del modelo
- 9. Django - Comparar el código del modelo en la base de datos
- 10. ChoiceField en Django modelo
- 11. Django: Creación de Mixin para campos de modelo reutilizables
- 12. Deshabilitar la creación de sesiones en Django
- 13. Django ManyToMany validación del modelo
- 14. ejecutar el código después de la confirmación de la transacción en Django
- 15. Fecha de creación automática para objetos de formulario modelo django?
- 16. Reordenando campos en Django modelo
- 17. Mismo campo, diferentes opciones en las subclases del modelo Django
- 18. creación de formulario django en init
- 19. Campo oculto en Django Modelo
- 20. ¿Cómo sé si se modificó la instancia del modelo django?
- 21. ¿Agregar solicitud al método del modelo django?
- 22. ¿Cómo extiendo el modelo del Grupo Django?
- 23. ¿Cómo introspeccionar los campos del modelo django?
- 24. Django - Representación gráfica del modelo (ERD)
- 25. Django: ¿accediendo a la instancia del modelo desde ModelAdmin?
- 26. Agregando atributos a la clase meta del modelo Django
- 27. ¿Cómo se extiende el modelo de sitio en django?
- 28. ¿Ejecutar el código en la consola cerrada?
- 29. Ejecutar el código C# en la GPU
- 30. Creación de superusuario en django-nonrel
He intentado esto, pero estaba recibiendo un error. Resultó que estoy usando la versión de Django (1, 1, 1, 'final', 0) y esto funciona solo para Django 1.3 y superior. Intentaré actualizar pero ¿conoces algún otro método? ¡Gracias! –
@Rohit: ¿Cuál fue el error en 1.1.1? Estas señales existían en 1.1.1, la configuración puede ser un poco diferente, o tengo un error tipográfico. – sdolan
@RohitAgarwal: Eché un vistazo a los documentos antiguos y actualicé la parte inferior de mi ejemplo de lo que debería funcionar para 1.1.1. – sdolan