python - signal - Señales de Django vs. método de salvar anulando
receiver signal django (5)
Estoy teniendo problemas para entender esto. En este momento tengo algunos modelos que se ven así:
def Review(models.Model)
...fields...
overall_score = models.FloatField(blank=True)
def Score(models.Model)
review = models.ForeignKey(Review)
question = models.TextField()
grade = models.IntegerField()
Una revisión tiene varios "puntajes", la puntuación general es el promedio de los puntajes. Cuando se guarda una revisión o un puntaje, necesito volver a calcular el promedio general de puntuación. En este momento estoy usando un método de salvar anulado. ¿Habría algún beneficio al usar el despachador de señal de Django?
Es un tipo amable de denormalización. Mira esta bonita solución . Definición del campo de composición en el lugar.
Las señales de guardar / eliminar son generalmente favorables en situaciones en las que necesita realizar cambios que no son completamente específicos del modelo en cuestión, o podrían aplicarse a modelos que tienen algo en común, o podrían configurarse para su uso en todos los modelos.
Una tarea común en los métodos de save
anulados es la generación automatizada de babosas desde algún campo de texto en un modelo. Ese es un ejemplo de algo que, si necesitara implementarlo para una serie de modelos, se beneficiaría del uso de una señal pre_save
, donde el manejador de señal podría tomar el nombre del campo slug y el nombre del campo para generar el slug de . Una vez que tenga algo así en su lugar, cualquier funcionalidad mejorada que ponga en su lugar también se aplicará a todos los modelos, por ejemplo, buscando la babosa que está a punto de agregar para el tipo de modelo en cuestión, para garantizar la singularidad.
Las aplicaciones reutilizables a menudo se benefician del uso de señales: si la funcionalidad que proporcionan se puede aplicar a cualquier modelo, generalmente (a menos que sea inevitable) no querrán que los usuarios tengan que modificar directamente sus modelos para beneficiarse de ello.
Con django-mptt , por ejemplo, utilicé la señal pre_save
para administrar un conjunto de campos que describen una estructura de árbol para el modelo que está a punto de crearse o actualizarse y la señal de pre_delete
para eliminar los detalles de la estructura de árbol para el objeto que se elimina y todo su subárbol de objetos antes que él y se eliminan. Debido al uso de señales, los usuarios no tienen que agregar ni modificar métodos de save
o delete
en sus modelos para que se les haga esta gestión, solo tienen que dejar que django-mptt sepa qué modelos quieren que administre.
Las señales son útiles cuando tiene que ejecutar un proceso a largo plazo y no quiere bloquear a su usuario esperando a que se complete.
Si usa señales, podrá actualizar la puntuación de Revisión cada vez que se guarde el modelo de puntaje relacionado. Pero si no necesito esa funcionalidad, no veo ninguna razón para poner esto en señal, eso es bastante relacionado con el modelo.
Tu preguntaste:
¿Habría algún beneficio al usar el despachador de señal de Django?
Encontré esto en los documentos de django:
Los métodos de modelo anulados no se invocan en operaciones masivas
Tenga en cuenta que el método delete () para un objeto no se llama necesariamente cuando se eliminan objetos a granel utilizando un QuerySet o como resultado de una eliminación en cascada. Para garantizar que se ejecute la lógica de eliminación personalizada, puede usar las señales pre_delete y / o post_delete.
Lamentablemente, no hay una solución alternativa al crear o actualizar objetos en bloque, ya que no se llama a ninguno de los elementos save (), pre_save y post_save.