110 votes

Signaux Django et méthode de sauvegarde prioritaire

J'ai du mal à comprendre ce que je pense. En ce moment, j'ai quelques modèles qui ressemblent à ça:

  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()
 

Une revue a plusieurs "scores", le score global est la moyenne des scores. Lorsqu'un commentaire ou une note est enregistré, je dois recalculer la moyenne de Overall_score. En ce moment, j'utilise une méthode de sauvegarde remplacée. Y aurait-il des avantages à utiliser le répartiteur de signaux de Django?

96voto

insin Points 19509

Enregistrer/supprimer les signaux sont généralement favorables dans les situations où vous avez besoin de faire des changements qui ne sont pas totalement spécifiques au modèle en question, ou pourraient être appliquées à des modèles qui ont quelque chose en commun, ou peut être configuré pour une utilisation sur les modèles.

Une tâche courante dans substituée save méthodes de génération automatique de limaces de certaines champ de texte dans un modèle. C'est un exemple de quelque chose qui, si vous avez besoin pour le mettre en oeuvre un certain nombre de modèles, pourrait bénéficier de l'aide d'un pre_save de signal, où le gestionnaire de signal pourrait prendre le nom de la limace de domaine et le nom du champ à générer de la limace. Une fois que vous avez quelque chose comme ça, tout d'améliorer les fonctionnalités que vous mettez en place s'appliquent également à tous les modèles - par exemple, la recherche de la limace vous êtes sur le point d'ajouter pour le type de modèle en question, afin d'assurer l'unicité.

Réutilisable applications bénéficient souvent de l'utilisation de signaux - si les fonctionnalités qu'ils fournissent peuvent être appliqués à n'importe quel modèle, ils ont généralement (sauf si c'est inévitable) a remporté voulez pas que les utilisateurs ont la possibilité de modifier leurs modèles afin d'en bénéficier.

Avec django-mptt, par exemple, j'ai utilisé l' pre_save signal de 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 l' pre_delete signal pour supprimer structure de l'arborescence des détails de l'objet supprimé et l'ensemble de ses sous-arborescence d'objets avant et ils sont supprimés. En raison de l'utilisation de signaux, les utilisateurs n'ont pas d'ajouter ou de modifier save ou delete méthodes sur leurs modèles à avoir cette gestion fait pour eux, ils ont juste à se laisser django-mptt savoir quels modèles ils le veulent à gérer.

3voto

Dmitry Shevchenko Points 11398

Si vous utilisez des signaux, vous pourrez mettre à jour le score de révision à chaque fois que le modèle de score associé est enregistré. Mais si vous n'avez pas besoin de cette fonctionnalité, je ne vois aucune raison de le mettre dans le signal, ce qui est plutôt lié au modèle.

2voto

Alex Koshelev Points 5522

C'est une sorte de dénormalisation. Regardez cette jolie solution . Définition du champ de composition en place.

-29voto

Juanjo Conti Points 4810

Les signaux sont utiles lorsque vous devez exécuter un processus à long terme et que vous ne voulez pas bloquer votre utilisateur en attente de sauvegarde.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X