Frage

Ich habe Probleme beim Einwickeln meines Kopfes, um diesen. Im Moment habe ich einige Modelle, die ein bisschen wie folgt aussieht:

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

Eine Überprüfung ist, hat mehr „scores“, die overall_score der Durchschnitt der Noten ist. Wenn eine Überprüfung oder eine Punktzahl gespeichert wird, muss ich die overall_score Durchschnitt neu zu berechnen. Im Moment bin ich mit einer überschriebenen Methode speichern. Gäbe es keine Vorteile sein Djangos Signal Dispatcher verwenden?

War es hilfreich?

Lösung

Speichern / Löschen Signale in Situationen im Allgemeinen günstig sind, wo Sie Änderungen vornehmen müssen, die auf das betreffende Modell nicht völlig spezifisch sind, oder könnte auf Modelle angewendet werden, die etwas gemeinsam haben, oder könnten für die Verwendung in Modellen konfiguriert werden .

Eine gemeinsame Aufgabe in überschriebene save Methoden wird von einem Textfeld in einer Modellgeneration von Schnecken automatisiert. Das ist ein Beispiel für etwas, das, wenn Sie es für eine Reihe von Modellen implementieren müssen, von der Verwendung eines pre_save Signals profitieren würde, in dem die Signal-Handler den Namen des Slug-Feldes und den Namen des Feldes den Rohlings zu erzeugen nehmen könnten aus . Wenn Sie so etwas wie das an der richtigen Stelle, jede erweiterte Funktionalität setzen Sie an Ort und Stelle wird auch für alle Modelle gelten - z.B. die Schnecke Sie sind dabei aufzublicken für die Art des Modells in Frage hinzufügen, um sicherzustellen, Einzigartigkeit.

Wiederverwendbare Anwendungen profitieren häufig von der Verwendung von Signalen - wenn die Funktionalität können sie liefern zu jedem Modell angewendet werden, sie in der Regel (es sei denn, es unvermeidlich ist) werden die Nutzer nicht wollen direkt haben, um ihre Modelle zu modifizieren, um davon zu profitieren .

Mit django-MPTT , zum Beispiel, habe ich das pre_save Signal zu verwalten eine Reihe von Feldern, die eine Baumstruktur für das Modell beschreiben, die im Begriff ist, erstellt oder aktualisiert und das pre_delete Signal zu Baumstruktur Details für das Objekt zu entfernen, bevor sie gelöscht und sein gesamte Unterbaum von Objekten und sie gelöscht werden. Durch die Verwendung von Signalen, müssen Benutzer save oder delete Methoden auf ihre Modelle haben dieses Management getan für sie nicht hinzufügen oder ändern, sie müssen nur django-MPTT wissen lassen, welche Modelle sie wollen es verwalten.

Andere Tipps

Sie haben gefragt:

Gäbe es keine Vorteile sein Djangos Signal Dispatcher verwenden?

Ich fand diese in den django docs:

  

Überschrieben Modell Methoden nicht auf Massenoperationen aufgerufen werden

     Hinweis

, dass die Methode delete () für ein Objekt nicht unbedingt genannt   wenn Objekte in der Masse unter Verwendung eines QuerySet oder als Ergebnis ein Löschen   Cascading löschen. Um maßgeschneiderte Löschlogik zu gewährleisten wird Ihnen ausgeführt wird,   können pre_delete und / oder post_delete Signale.

     

Leider gibt es keine Abhilfe bei der Erstellung oder Aktualisierung   Objekte in der Masse, da keiner von save (), pre_save und post_save sind   genannt.

Von: Zwingende vordefinierten Modell Methoden

Wenn Sie Signale verwenden werden, würden Sie in der Lage sein, jedes Mal im Zusammenhang Score-Modell gespeichert wird aktualisieren Gastbeurteilung. Aber wenn nicht eine solche Funktionalität muss ich dies keinen Grund sehen, setzen in das Signal, das ist ziemlich modellbezogene Sachen.

Es ist eine Art Art Denormalisation. Schauen Sie sich diese ziemlich Lösung rel="nofollow. In-Place-Zusammensetzung Felddefinition.

Kleine Zugabe von Django docs über bulk (.delete() Methode auf QuerySet Objekte) löschen:

  

Beachten Sie, dass dies, wenn möglich, durchgeführt werden rein   SQL, und so die delete () Methoden der einzelnen Objektinstanzen werden   nicht unbedingt während des Prozesses aufgerufen werden. Wenn Sie noch ein zur Verfügung gestellt   löschen Sie benutzerdefinierte () -Methode auf einer Modellklasse und wollen sicherstellen, dass es   löschen Instanzen dieses Modell genannt, müssen Sie „von Hand“ zu   (Zum Beispiel durch einen QuerySet iterieren und Aufruf löschen () auf jedem   Objekt einzeln), anstatt die Masse löscht () Verfahren zur Herstellung eines mit   QuerySet.

https://docs.djangoproject.com/ de / 1.11 / Themen / db / Abfragen / # Löschen-Objekte

Und Massenaktualisierung (.update() Methode auf QuerySet Objekte):

  

Schließlich erkennt, dass update () tut ein Update auf SQL-Ebene und,   Somit ruft keine save () Methoden auf Ihre Modelle, noch hat es   emittieren die pre_save oder post_save Signale (die eine Folge der   Aufruf Model.save ()). Wenn Sie eine Menge von Datensätzen für eine Aktualisierung   Modell, das eine benutzerdefinierte save () Methode, eine Schleife über sie hat und Anruf speichern ()

https://docs.djangoproject.com/en/ 2.1 / ref / models / querysets / # update

Signale sind nützlich, wenn Sie etwas langwieriger Prozess auszuführen haben und wollen nicht Ihre Benutzer sperren warten abzuschließen speichern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top