Das Signal
Ein Signal ist ein Mechanismus , der Ihren Code (Funktion/Methode) auslöst , wenn ein bestimmtes Ereignis in ormar auftritt .
Dazu müssen Sie einen Empfänger für einen bestimmten Signaltyp des ausgewählten Modells registrieren .
Definition der Empfänger
Geben Sie folgende Beispielmodelle :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
Zum Beispiel können Sie einen Trigger definieren , der gesetzt wird , wenn das Album mehr als 50 Mal abgespielt wird .album.isDer _ _ best _ seller Zustand .
Importieren Sie den pre _ update-Dekorator , um die folgende Liste der derzeit verfügbaren Dekoratoren/Signale zu sehen .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | |
Definieren Sie Ihre Funktionen .
Beachten Sie , dass jede Empfängerfunktion :
- Es muss abgeschickt werden .
- Sie müssen den ersten Senderparameter der sendenden Objektklasse akzeptieren .
- muss den Parameter **kwargs als Parameter akzeptieren , die in jedem Ormar gesendet werden , und daher muss Ihre Funktion diese unterstützen .
- Es muss asynchron sein , da die Rückrufe gesammelt und gewartet werden .
pre_update sendet derzeit nur einen anderen Parameter als den Absender, und es ist Instanz 1.
Beachten Sie, wie der pre_update-Dekorator den senders-Parameter akzeptiert, bei dem es sich um ein einzelnes Modell oder eine Liste von Modellen handelt, für die Sie den Signalempfänger ausführen möchten.
Derzeit ist es nicht möglich, alle Modelle sofort zu signalisieren, ohne explizit alle Modelle in die Empfängerregistrierung zu übergeben.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | |
!!!note Beachten Sie, dass der Empfänger auf der Klassenebene-> definiert ist, so dass er alle Operationen für diese ormar. Model-Klasse ausführt/stoppt, selbst wenn Sie über eine Instance-Funktion verbunden/getrennt haben.
Beachten Sie, dass unsere neu erstellte Funktion über Instances und Instance-Klassen verfügt, sodass Sie auf Wunsch problemlos Datenbankabfragen innerhalb des Empfängers ausführen können.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | |
Sie können denselben Empfänger für mehrere Modelle gleichzeitig definieren, indem Sie die Modellliste an den Signaldekorator weitergeben.
1 2 3 4 | |
Natürlich können Sie auch mehrere Funktionen für das gleiche Signal und Modell erstellen, von denen jeder zu jedem Zeitpunkt ausgeführt wird.
1 2 3 4 5 6 7 | |
Beachten Sie, dass Ormar Dekoratoren syntaktisch Zucker sind und Sie die Funktion oder Methode eines bestimmten Signals in einem bestimmten Modell direkt verbinden können, indem Connect nur einen Parameter akzeptiert-Ihre Empfängerfunktion/-methode.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
Warnung Beachten Sie , dass das Signal einen Verweis auf den Empfänger behält (im Gegensatz zu einem schwachen Verweis) , also denken Sie daran , um wiederkehrende Referenzen zu vermeiden .
Verbindung mit dem Empfänger trennen .
Um den Empfänger zu trennen und die Ausführung eines bestimmten Modells zu stoppen , müssen Sie ihn trennen .
1 2 3 4 5 6 7 8 9 10 | |
Signal zur Verfügung .
!!!Bitte beachten Sie , dass keine Signale gesendet werden :
1 2 3 4 | |
Pre-Erhaltung
pre_save(sender: Type["Model"], instance: "Model")
SendenModel.saveDie Methode Model . objects . create () wird unterstützt .
sender ist eine ormar . Model-Klasse und instance ist das zu speichernde Modell .
Nach der Erhaltung
post_save(sender: Type["Model"], instance: "Model")
SendenModel.saveDie Methode Model . objects . create () wird verwendet .
sender ist eine ormar . Model-Klasse und instance ist das gespeicherte Modell .
Vorschau aktualisiert
pre_update(sender: Type["Model"], instance: "Model")
Senden Sie an die Methode Model . update () .
sender ist eine ormar . Model-Klasse und instance ist das zu aktualisierende Modell .
Nach der Aktualisierung
post_update(sender: Type["Model"], instance: "Model")
Senden Sie an die Model . update () - Methode .
sender ist eine ormar . Model-Klasse und instance ist ein aktualisiertes Modell .
Pre-Streichung
pre_delete(sender: Type["Model"], instance: "Model")
sendenModel.saveDie Methode Model . objects . create () wird unterstützt .
sender ist eine ormar . Model-Klasse und instance ist das zu löschende Modell .
Nach Streichung
post_delete(sender: Type["Model"], instance: "Model")
Senden Sie an die Model . update () - Methode .
sender ist eine ormar . Model-Klasse und instance ist das gelöschte Modell .
Vorher-Beziehung hinzufügen
pre_relation_add(sender: Type["Model"], instance: "Model", child: "Model", relation_name: str, passed_args: Dict)
Die Model . relation \ _ name . add () - Methode , die eine Mehr-zu - Mehr-Beziehung sendet , dreht die Fremdschlüsselbeziehung um .
sender-class , instance - Hinzufügen einer Instanz des zugehörigen Modells , child - Modell , das hinzugefügt wird , relation \ _ name - Name der Beziehung , in der Unterelemente hinzugefügt werden , für das Hinzufügen von Signalen auch übergeben \ _ kwargs - Dictionary für kwargs , die an add () übergeben werden
Post-Beziehung hinzufügen
post_relation_add(sender: Type["Model"], instance: "Model", child: "Model", relation_name: str, passed_args: Dict)
Die Model . relation \ _ name . add () - Methode , die eine Mehr-zu - Mehr-Beziehung sendet , dreht die Fremdschlüsselbeziehung um .
sender-class , instance - Hinzufügen einer Instanz des zugehörigen Modells , child - Modell , das hinzugefügt wird , relation \ _ name - Name der Beziehung , in der Unterelemente hinzugefügt werden , für das Hinzufügen von Signalen wird auch übergeben \ _ kwargs - Dictionary für kwargs , die an add () übergeben werden
Vorhersage-Beziehung abgeschafft
pre_relation_remove(sender: Type["Model"], instance: "Model", child: "Model", relation_name: str)
Die Model . relation \ _ name . remove () - Methode , die eine Mehr-zu - Mehr-Beziehung sendet , ist die Umkehrung der Fremdschlüsselbeziehung .
sender-Klasse, instance-Hinzufügen einer Instanz des zugehörigen Modells, child-Das hinzugefügte Modell, relation_name-Name der Beziehung, in der das Unterelement hinzugefügt wird.
Nach Beendigung der Beziehung
post_relation_remove(sender: Type["Model"], instance: "Model", child: "Model", relation_name: str, passed_args: Dict)
Die Model. relation_name. remove ()-Methode, die eine Mehr-zu-Mehr-Beziehung sendet, ist die Umkehrung der Fremdschlüsselbeziehung.
sender-Klasse, instance-Hinzufügen einer Instanz des zugehörigen Modells, child-Das hinzugefügte Modell, relation_name-Name der Beziehung, in der das Unterelement hinzugefügt wird.
Nach der Aktualisierung der Menge
post_bulk_update(sender: Type["Model"], instances: List["Model"], **kwargs), das an die Model.objects.bulk_update(List[objects])-methode gesendet wird.
Definieren Sie Ihr eigenes Signal
Beachten Sie, dass Sie Ihre eigenen Signale erstellen können, obwohl Sie sie manuell im Code oder in einer Unterklasse von ormar. Model senden und dort das Signal auslösen müssen.
Das folgende Beispiel legt ein neues Signal mit dem Namen your_custom_signal fest.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
In der Tat ist die zugrunde liegende Ebene des Signals eine SignalEmiter-Instanz, die das Wörterbuch der bekannten Signale speichert und Ihnen erlaubt, auf sie als Eigenschaften zuzugreifen Wenn Sie versuchen, auf ein nicht vorhandenes Signal zuzugreifen, erstellt SignalEmiter ein Signal für Sie.
So kann das obige Beispiel vereinfacht werden, um das Signal für Sie zu erstellen.
1 | |
Um dieses Signal jetzt auszulösen, müssen Sie die Methode zum Senden des Signals aufrufen.
1 | |
Beachten Sie, dass sender der einzige erforderliche Parameter ist und die ormar-Model-Klasse sein sollte.
Die zusätzlichen Parameter müssen als Schlüsselwortparameter übergeben werden.
1 | |