Les signaux de sauvegarde/suppression sont généralement favorables dans les situations où vous devez apporter des modifications qui ne sont pas complètement spécifiques au modèle en question ou qui pourraient être appliquées à des modèles qui ont quelque chose en commun ou peuvent être configurés des modèles.
Une tâche courante dans les méthodes save
remplacées est la génération automatique de slugs à partir d'un champ de texte dans un modèle. C'est un exemple de quelque chose qui, si vous deviez l'implémenter pour un certain nombre de modèles, aurait avantage à utiliser un signal pre_save
, où le gestionnaire de signal pourrait prendre le nom du champ slug et le nom du champ pour générer le slug de . Une fois que vous avez quelque chose comme cela en place, toute fonctionnalité améliorée que vous mettez en place s'appliquera également à tous les modèles - par ex. en regardant la limace que vous êtes sur le point d'ajouter pour le type de modèle en question, pour assurer l'unicité.
Les applications réutilisables bénéficient souvent de l'utilisation de signaux - si la fonctionnalité qu'elles fournissent peut être appliquée à n'importe quel modèle, elles ne veulent généralement pas (sauf si c'est inévitable) que les utilisateurs modifient directement leurs modèles pour bénéficier de il.
Avec django-mptt, par exemple, j'utilise le signal pre_save
pour gérer un ensemble de champs qui décrivent une structure arborescente pour le modèle qui est sur le point d'être créé ou mis à jour et le signal pre_delete
pour éliminer les détails de la structure de l'arbre pour l'objet supprimé et son sous-arbre entier d'objets avant et ils sont supprimés. En raison de l'utilisation de signaux, les utilisateurs n'ont pas besoin d'ajouter ou de modifier les méthodes save
ou delete
sur leurs modèles pour que cette gestion soit faite pour eux, ils doivent simplement indiquer à django-mptt quels modèles ils veulent gérer.
Non, à moins que vous signaux bloc engendrez threads explicitement. – muhuk
@muhuk a raison, les signaux bloquent vos processus. Si vous souhaitez éviter les processus bloqués, utilisez des outils tels que gevent, céleri ou d'autres outils asynchrones. – pydanny
Je lui donne un -1 à cause des points de muhuk et pydanny. On dirait que c'est un mauvais conseil. La demande ne finira pas jusqu'à ce que le traitement du signal soit terminé. Donc le céleri semble être une bonne solution, ce que j'utilise normalement dans mes projets django. –