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 entre modelos.
Una tarea común en los save
métodos anulados es la generación automática de slugs a partir de algún campo de texto en un modelo. Ese es un ejemplo de algo que, si necesita implementarlo para varios modelos, se beneficiaría del uso de una pre_save
señal, donde el manejador de señales podría tomar el nombre del campo slug y el nombre del campo desde el que generar el slug. Una vez que tenga algo así en su lugar, cualquier funcionalidad mejorada que implemente también se aplicará a todos los modelos, por ejemplo, buscar la barra 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 ella.
Con django-mptt , por ejemplo, utilicé la pre_save
señal 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 pre_delete
señal para eliminar los detalles de la estructura de árbol para el objeto que se está eliminando y su totalidad subárbol de objetos antes de él y se eliminan. Debido a la utilización de señales, los usuarios no tienen que añadir o modificar save
o delete
métodos en sus modelos para tener esta gestión hecho por ellos, sólo tienen que dar a conocer django-MPTT qué modelos lo quieren manejar.
Tu preguntaste:
¿Habría algún beneficio al usar el despachador de señales de Django?
Encontré esto en los documentos de django:
De: Anulación de métodos de modelo predefinidos
fuente
save
método".Si usa señales, podrá actualizar la puntuación de revisión cada vez que se guarde el modelo de puntuación relacionado. Pero si no necesito tal funcionalidad, no veo ninguna razón para poner esto en señal, eso es bastante relacionado con el modelo.
fuente
Es una especie de desnormalización. Mira esta bonita solución . Definición del campo de composición in situ.
fuente
Pequeña adición de los documentos de Django sobre eliminación masiva (
.delete()
método enQuerySet
objetos):https://docs.djangoproject.com/en/1.11/topics/db/queries/#deleting-objects
Y actualización masiva (
.update()
método enQuerySet
objetos):https://docs.djangoproject.com/en/2.1/ref/models/querysets/#update
fuente