Django-Signale vs. Overriding-Save-Methode

Ich habe Schwierigkeiten, meinen Kopf um diesen herum zu wickeln. Im Moment habe ich einige Modelle, die so aussehen wie folgt:

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

Ein Review hat mehrere "Scores", der Gesamtscore ist der Durchschnitt der Scores. Wenn eine Überprüfung oder eine Partitur gespeichert wird, muss ich den Gesamt-Durchschnitt neu berechnen. Im Moment nutze ich eine überschriebene Sicherungsmethode. Gibt es irgendwelche Vorteile für die Verwendung von Djangos Signal-Dispatcher?

  • Django: Mit dem gleichen Objekt, wie man 2 verschiedene Ergebnisse in django Vorlage zu zeigen?
  • Verhindern, dass Verwaltungsbefehle mehr als einmal ausgeführt werden
  • Effiziente Art und Weise zu halten und zu verarbeiten ein großes Dict in Erinnerung in Python
  • Python oauth2 - Anforderung anfordern
  • Django Push-Benachrichtigungen mit Gerät benutzerdefinierte Modell
  • Wie bekomme ich die aktuelle Sprache in django?
  • 5 Solutions collect form web for “Django-Signale vs. Overriding-Save-Methode”

    Speichern / Löschen von Signalen sind in der Regel günstig in Situationen, in denen Sie Änderungen vornehmen müssen, die nicht ganz spezifisch für das betreffende Modell sind oder auf Modelle angewendet werden können, die etwas gemeinsam haben oder für den Einsatz über Modelle konfiguriert werden können.

    Eine gemeinsame Aufgabe bei überschriebenen save ist die automatisierte Erzeugung von Schnecken aus einem Textfeld in einem Modell. Das ist ein Beispiel für etwas, das, wenn man es für eine Reihe von Modellen implementieren musste, von einem pre_save Signal profitieren würde, wo der Signalhandler den Namen des Slug-Feldes und den Namen des Feldes nehmen könnte, um den Slug zu erzeugen . Sobald Sie so etwas an Ort und Stelle haben, wird jede erweiterte Funktionalität, die Sie setzen, auch für alle Modelle gelten – z. B. nach dem Slug, den Sie für die Art des Modells in Frage stellen möchten, um Einzigartigkeit zu gewährleisten.

    Wiederverwendbare Anwendungen profitieren oft von der Verwendung von Signalen – wenn die Funktionalität, die sie bereitstellen, auf jedes Modell angewendet werden kann, ist es im Allgemeinen (es sei denn, es ist unvermeidbar), dass die Benutzer ihre Modelle nicht direkt modifizieren müssen, um davon zu profitieren.

    Mit django-mptt habe ich zum Beispiel das pre_save Signal verwendet, um einen Satz von Feldern zu verwalten, die eine Baumstruktur für das zu beschreibende oder zu aktualisierende Modell beschreiben und das pre_delete Signal, um Baumstrukturdetails für das zu löschende Objekt zu entfernen und zu löschen Seinen ganzen Unterbaum von Objekten vor ihm und sie werden gelöscht. Aufgrund der Verwendung von Signalen, müssen die Benutzer nicht hinzufügen oder ändern, save oder delete Methoden auf ihre Modelle, um diese Verwaltung für sie getan haben, müssen sie nur django-mptt wissen, welche Modelle sie wollen, dass es zu verwalten.

    Du hast gefragt:

    Gibt es irgendwelche Vorteile für die Verwendung von Djangos Signal-Dispatcher?

    Ich fand das in den django docs:

    Überschriebene Modellmethoden werden nicht auf Bulk-Operationen aufgerufen

    Beachten Sie, dass die Delete () – Methode für ein Objekt nicht unbedingt beim Löschen von Objekten in loser Schüttung mit einem QuerySet oder als Ergebnis eines Cascading Delete aufgerufen wird. Um sicherzustellen, dass die benutzerdefinierte Löschlogik ausgeführt wird, können Sie vor- und / oder Post_delete-Signale verwenden.

    Leider gibt es keine Problemumgehung beim Erstellen oder Aktualisieren von Objekten in der Masse, da keine von save (), pre_save und post_save aufgerufen werden.

    Von: Vordefinierte Modellmethoden überschreiben

    Wenn du Signale benutzt hast, würdest du in der Lage sein, die Bewertung zu beurteilen, jedes Mal, wenn das Spielmodell gespeichert wird. Aber wenn ich diese Funktion nicht brauche, sehe ich keinen Grund, dies in Signal zu bringen, das ist ziemlich modellbezogene Sachen.

    Es ist eine Art Art der Denormalisierung. Schau dir diese hübsche Lösung an . In-Place-Kompositionsfelddefinition

    Signale sind nützlich, wenn Sie einen langwierigen Prozess ausführen müssen und nicht möchten, dass Ihr Benutzer darauf wartet, dass der Speicher abgeschlossen ist.

    Python ist die beste Programmiersprache der Welt.