Django-Signale vs. überschreibende Speichermethode

Lesezeit: 5 Minuten

Django Signale vs uberschreibende Speichermethode
imjoevasquez

Ich habe Probleme, mich darum zu kümmern. Im Moment habe ich einige Modelle, die ungefähr so ​​​​aussehen:

 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 Bewertung hat mehrere “Punktzahlen”, die Gesamtpunktzahl ist der Durchschnitt der Punktzahlen. Wenn eine Bewertung oder eine Punktzahl gespeichert wird, muss ich den Gesamtpunktzahl-Durchschnitt neu berechnen. Im Moment verwende ich eine überschriebene Speichermethode. Würde es irgendwelche Vorteile geben, den Signalverteiler von Django zu verwenden?

Django Signale vs uberschreibende Speichermethode
Jonny Buchanan

Signale zum Speichern/Löschen sind im Allgemeinen in Situationen günstig, in denen Sie Änderungen vornehmen müssen, die nicht vollständig spezifisch für das betreffende Modell sind, oder auf Modelle angewendet werden könnten, die etwas gemeinsam haben, oder für die modellübergreifende Verwendung konfiguriert werden könnten.

Eine allgemeine Aufgabe wird überschrieben save Methoden ist die automatisierte Generierung von Slugs aus einem Textfeld in einem Modell. Das ist ein Beispiel für etwas, das, wenn Sie es für eine Reihe von Modellen implementieren müssten, von der Verwendung von a profitieren würde pre_save signal, wobei der Signal-Handler den Namen des Slug-Felds und den Namen des Felds nehmen könnte, aus dem der Slug generiert werden soll. Sobald Sie so etwas eingerichtet haben, gelten alle erweiterten Funktionen, die Sie einrichten, auch für alle Modelle – z. B. das Nachschlagen des Slugs, den Sie für den betreffenden Modelltyp hinzufügen möchten, um die Einzigartigkeit sicherzustellen.

Wiederverwendbare Anwendungen profitieren häufig von der Verwendung von Signalen – wenn die von ihnen bereitgestellte Funktionalität auf jedes Modell angewendet werden kann, möchten sie im Allgemeinen (sofern es nicht unvermeidlich ist) nicht, dass Benutzer ihre Modelle direkt ändern müssen, um davon zu profitieren.

Mit django-mptt, zum Beispiel habe ich die verwendet pre_save Signal zum Verwalten eines Satzes von Feldern, die eine Baumstruktur für das zu erstellende oder zu aktualisierende Modell beschreiben, und das pre_delete Signal zum Entfernen von Baumstrukturdetails für das zu löschende Objekt und seinen gesamten Unterbaum von Objekten davor, und sie werden gelöscht. Aufgrund der Verwendung von Signalen müssen Benutzer nichts hinzufügen oder ändern save oder delete Methoden auf ihren Modellen, um diese Verwaltung für sie erledigen zu lassen, sie müssen lediglich django-mptt wissen lassen, welche Modelle sie verwalten sollen.

  • Was ist, wenn der Signalhandler eine Ausnahme auslöst? Ich nehme an, sie sollten keine Ausnahmen auslösen, sonst passen sie nicht gut. Liege ich falsch?

    – x-yuri

    13. Januar 19 um 11:15 Uhr

Du hast gefragt:

Würde es irgendwelche Vorteile geben, den Signalverteiler von Django zu verwenden?

Ich habe das in den Django-Dokumenten gefunden:

Überschriebene Modellmethoden werden bei Massenvorgängen nicht aufgerufen

Beachten Sie, dass die delete()-Methode für ein Objekt nicht unbedingt aufgerufen wird, wenn Objekte in großen Mengen mit einem QuerySet oder als Ergebnis eines kaskadierenden Löschvorgangs gelöscht werden. Um sicherzustellen, dass eine benutzerdefinierte Löschlogik ausgeführt wird, können Sie pre_delete- und/oder post_delete-Signale verwenden.

Leider gibt es keine Problemumgehung beim Erstellen oder Aktualisieren von Objekten in großen Mengen, da keines von save(), pre_save und post_save aufgerufen wird.

Von: Überschreiben vordefinierter Modellmethoden

  • Die Django-Admin-Listenansicht verwendet Massenlöschung … war verwirrt, bis ich auf diesen Leckerbissen stieß.

    – N.Balauro

    10. Februar 17 um 18:56 Uhr

  • Es heißt auch: “Leider gibt es keine Problemumgehung beim Erstellen oder Aktualisieren von Objekten in großen Mengen, da keines von save(), pre_save und post_save aufgerufen wird.” – Ich glaube also nicht, dass dies ein Kompromiss zwischen diesen Methoden ist.

    – Kory

    11. September 17 um 10:15 Uhr

  • Dies gilt für beide Methoden, daher lautet die Antwort dann: “Nein, es gibt keinen Vorteil, Signale zu verwenden, anstatt die zu überschreiben save Methode”?

    – Flimmer

    4. Dezember 19 um 13:21 Uhr

Wenn Sie Signale verwenden, können Sie die Bewertungsbewertung jedes Mal aktualisieren, wenn das zugehörige Bewertungsmodell gespeichert wird. Aber wenn ich solche Funktionen nicht brauche, sehe ich keinen Grund, dies in Signal zu setzen, das ist ziemlich modellbezogenes Zeug.

Es ist eine Art Denormalisierung. Schau dir das an hübsche Lösung. Direkte Kompositionsfelddefinition.

Django Signale vs uberschreibende Speichermethode
Wert

Kleine Ergänzung aus Django-Dokumentation zum Massenlöschen (.delete() Methode an QuerySet Objekte):

Beachten Sie, dass dies, wann immer möglich, rein in SQL ausgeführt wird und daher nicht unbedingt die delete()-Methoden einzelner Objektinstanzen während des Prozesses aufgerufen werden. Wenn Sie eine benutzerdefinierte delete()-Methode für eine Modellklasse bereitgestellt haben und sicherstellen möchten, dass sie aufgerufen wird, müssen Sie Instanzen dieses Modells „manuell“ löschen (z. B. indem Sie über ein QuerySet iterieren und delete() on aufrufen). jedes Objekt einzeln), anstatt die Bulk-delete()-Methode eines QuerySet zu verwenden.

https://docs.djangoproject.com/en/1.11/topics/db/queries/#deleting-objects

Und Bulk-Update (.update() Methode an QuerySet Objekte):

Beachten Sie schließlich, dass update() eine Aktualisierung auf SQL-Ebene durchführt und daher keine save()-Methoden für Ihre Modelle aufruft und auch keine pre_save- oder post_save-Signale ausgibt (die eine Folge des Aufrufs von Model.save( sind). )). Wenn Sie eine Reihe von Datensätzen für ein Modell mit einer benutzerdefinierten save()-Methode aktualisieren möchten, durchlaufen Sie sie und rufen Sie save() auf.

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

  • Gilt das nicht für beide?

    – Flimmer

    4. Dezember 19 um 13:21 Uhr

  • Gilt das nicht für beide?

    – Flimmer

    4. Dezember 19 um 13:21 Uhr

.

501360cookie-checkDjango-Signale vs. überschreibende Speichermethode

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy