Die Modell-Methode
Die primäre Interaktion von!!!tip mit der Datenbank wird durch QuerySet-Objekte auf jedem Modell öffentlich gemacht, die als Model. objects, ähnlich wie django orm, öffentlich zugänglich sind.
1 | |
Jede Modellinstanz verfügt über eine Reihe von Methoden zum Speichern, Aktualisieren oder Laden von sich selbst.
Die verfügbaren Methoden sind im Folgenden beschrieben.
Pedantische Methoden.
Beachten Sie, dass jedes ormar. Model auch ein pydantic. BaseModel ist, daher können alle pydantischen Methoden auch mit dem Modell verwendet werden, insbesondere die Methoden model_dump () und model_dump_json (), die auch Ausschlüsse, Inklusionen und andere Parameter akzeptieren.
Um mehr zu erfahren, schauen Sie sich die pydantische Dokumentation an
construct_construct () Bearbeiten
Modell_construct ist das ursprüngliche Äquivalent der Methode__init__, die zum Konstruieren neuer Instanzen verwendet wird.
Der Unterschied ist, dass model_construct die Validierung überspringt, so dass Sie es verwenden sollten, wenn Sie wissen, dass die Daten korrekt und vertrauenswürdig sind Der Vorteil der Verwendung des Konstrukts besteht darin, dass die Ausführungsgeschwindigkeit durch Überspringen der Validierung erhöht wird.
!!!Beachten Sie, dass im Gegensatz zur Methode pydantic. model_construct-eine äquivalente Ormar-Methode auch mit verschachtelten verwandten Modellen arbeitet.
WARNUNG Denken Sie daran, dass die Erstellungsmethode aufgrund des Überspringens der Überprüfung keine Konvertierungen, Prüfungen usw. durchführt und Sie für die Bereitstellung gültiger und für die Datenbank verfügbarer Daten verantwortlich sind.
1 2 3 4 | |
Modellablagerung ()
model_dump ist eine Methode, die von pydantic erbt, aber ormar fügt seine eigenen Parameter hinzu und hat einige Nuancen, wenn es um die Verwendung von Standardwerten geht, also ist sie hier aus Gründen der Klarheit aufgeführt.
Model_dump exportiert Daten aus dem Modellbaum in das Wörterbuch.
Der Parameter model_dump zeigt:
Einfügen (oder Ändern)
include: Union[Set, Dict] = None
Der Satz von Feldnamen oder Dictionary, der in das zurückgegebene Wörterbuch aufgenommen werden soll.
Beachten Sie, dass pydantic ein seltenes Muster hat, das durch Indexieren von Feldern aus einer Inclusion/Exclusion Liste (wie auch bei verschachtelten Modellen) funktioniert Wenn Sie Felder aus allen Unterschlüsseln ausschließen möchten, müssen Sie den Schlüssel__all__an das Wörterbuch übergeben.
Sie können verschachtelte Modelle in Sets nicht von pydantic ausschließen, aber in ormar (indem Sie einen doppelten Unterstrich über den relationalen Namen hinzufügen, d. h. die Klassennamen der Bücher ausschließen, die Sie verwenden können) exclude={"book__category__name"} )
Ormar unterstützt keine Indexausschlüsse/-einschlüsse und akzeptiert eine vereinfachte und benutzerfreundlichere Notation.
Um zu überprüfen, wie Felder (einschließlich verschachtelter Felder) einbezogen/ausgeschlossen werden können, sehen Sie sich den Abschnitt mit den Feldern an, der Erklärungen und eine große Anzahl von Beispielen enthält.
!!!Beachten Sie die Tatsache, dass Sie in ormar verschachtelte Modelle aus einer Sammlung ausschließen können, und Sie können aus dem gesamten Modellbaum in response_model_exclude und response_model_include in fastapi ausschließen!
Ausschluss (oder Änderung)
exclude: Union[Set, Dict] = None
Die Menge oder das Dictionary von Feldnamen, die im zurückgegebenen Wörterbuch ausgeschlossen werden sollen.
Beachten Sie, dass pydantic ein seltenes Muster hat, das Felder aus einer Liste durch Indizierung enthält/ausschließt (dasselbe gilt für verschachtelte Modelle), wenn Sie Felder aus allen Unterschlüsseln ausschließen möchten, müssen Sie_\hinzufügen._Alles_Der Schlüssel wird an das Wörterbuch übergeben.
Sie können verschachtelte Modelle in Sets nicht von pydantic ausschließen, aber in ormar (indem Sie dem relationalen Namen einen doppelten Unterstrich hinzufügen, d. h. den Klassennamen des verwendeten Buches ausschließen)exclude={"book__category__name"})
Ormar unterstützt keine Indexausschlüsse/-einschlüsse und akzeptiert eine vereinfachte und benutzerfreundlichere Notation.
Um zu überprüfen, wie Felder (einschließlich verschachtelter Felder) einbezogen/ausgeschlossen werden können, sehen Sie sich den Abschnitt mit den Feldern an, der Erklärungen und eine große Anzahl von Beispielen enthält.
!!!Beachten Sie die Tatsache, dass Sie in ormar verschachtelte Modelle aus einer Sammlung ausschließen können, und Sie können aus dem gesamten Modellbaum in response_model_exclude und response_model_include in fastapi ausschließen!
Ausgeschlossen-Abgesagt.
Ausschließen Nicht festgelegt: Boolean = False
Flag Gibt an, ob Felder, die beim Erstellen des Modells nicht explizit festgelegt wurden, aus dem zurückgegebenen Wörterbuch ausgeschlossen werden sollten.
!!!Warnung Beachten Sie, dass nach dem Speichern der Daten in der Datenbank jedes Feld einen eigenen Wert hat->, der von Ihnen angegeben werden kann, Standard oder nichts.
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 | |
Ausschließen von Bestätigungswerten
exclude_defaults: bool = False
Die Angabe eines Flags gleich seinem Standardwert (ob gesetzt oder nicht) sollte aus dem zurückgegebenen Wörterbuch ausgeschlossen werden
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 | |
Ausgeschlossen - nichts .
Ausgeschlossen \ _ keine : boolean = false
Flag Gibt an , ob ein Feld gleich None aus dem zurückgegebenen Dictionary ausgeschlossen werden soll .
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 | |
mit Ausnahme von \ _ primary \ _ keys (nur ormar)
exclude_primary_keys: bool = False
Wenn Sie die Kennzeichnung auf True festlegen , werden alle Primärschlüsselspalten in der Struktur ausgeschlossen , einschließlich verschachtelter Modelle .
1 2 3 4 5 6 7 8 9 | |
except \ _ through \ _ models (nur Ormar)
exclude_through_models: bool = False
Passthrough-Modelle werden automatisch für jede polare Beziehung hinzugefügt , und sie speichern zusätzliche Parameter auf dem verknüpften Modell/der verknüpften Tabelle .
Die Einstellung except \ _ through \ _ models = True schließt alle Passthrough-Modelle aus , einschließlich der Passthrough-Modelle von Untermodellen .
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 | |
Beispiel : _ dump _ json ()
model_dump_json () hat genau die gleichen Parameter wie model_dump (), also überprüfen Sie das oben.
Natürlich ist das Endergebnis eine Zeichenfolge, die von json repräsentiert wird, und kein Wörterbuch.
Verwendung von_pydantic ()
get_pydantic(include: Union[Set, Dict] = None, exclude: Union[Set, Dict] = None)
Mit dieser Methode können Sie ein Pydantik-Modell aus einem Ormar-Modell erstellen, ohne alle Felder erneut eingeben zu müssen.
Beachten Sie, dass, wenn Sie ein verschachteltes Modell haben, wird es den gesamten pydantischen Modellbaum für Sie generieren!
Darüber hinaus können Sie Ausschlüsse und/oder Parameter einschließen, um nur die Felder beizubehalten, die Sie möchten, auch in einem verschachtelten Modell.
Das bedeutet, dass Sie ganz einfach Pydantic-Modelle für Anfragen und Antworten in der Fastapi erstellen können.
Hinweis Um mehr über mögliche Ausschlüsse/Einschlüsse zu lesen und wie man ein Ausschlusswörterbuch oder eine Einstellung erstellt, besuchen Sie bitte den Abschnitt Felder des Dokuments.
Das Ormar-Modell wird wie folgt angegeben:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
Sie können ein Pydantic-Modell mit einem einfachen Aufruf erstellen.
1 | |
Dadurch wird ein Modell generiert, das dem folgenden entspricht:
1 2 3 | |
Es ist keine gute Gewohnheit , mehrere Klassen mit dem gleichen Namen in einem Modul zu haben , und es verdirbt die fastapi-Dokumentation , weshalb ormar zufällige 3 Großbuchstaben zu den Klassennamen hinzufügt Im obigen Beispiel bedeutet dies , dass die Klasse tatsächlich Category \ _ XIP (BaseModel) heißt .
Zum Ausschließen oder Einschließen verschachtelter Felder können Sie entweder ein Wörterbuch oder einen doppelten Unterstrich verwenden .
1 2 3 | |
Die entstandene Struktur ist wie folgt :
1 2 3 4 5 6 | |
Natürlich können Sie auch eine tief verschachtelte Struktur verwenden , deren pydantisches Äquivalent Ormar für Sie generiert (so , dass Schleifen ausgeschlossen werden) .
Beachten Sie , dass das obige Item-Modell keinen Bezug zu Category hat , obwohl die Beziehung in ormar bidirektional ist (und ormar . Item ein categories-Feld hat) .
Beachten Sie , dass das generierte pydantische Modell alle Feldvalidatoren vom ursprünglichen ormar-Modell erbt , einschließlich des ormar-Selection - Validators und der mit dem pydantic . validator definierten Validatoren .
1 2 | |
überladen ()
Wenn Sie eine Tabelle abfragen , ohne das zugehörige Modell vorab zu übernehmen , erstellt ormar Ihre zugehörigen Modelle standardmäßig noch , füllt sie jedoch nur mit pk-Werten aus , Sie können die zugehörigen Modelle laden , indem Sie die load () - Methode aufrufen .
load () kann auch verwendet werden , um ein Modell aus der Datenbank zu aktualisieren , wenn es von einem anderen Prozess geändert wurde .
1 2 3 4 5 6 7 | |
Alles löschen ()
load_all(follow: bool = False, exclude: Union[List, str, Set, Dict] = None) -> Model
Eine Methode funktioniert ähnlich wie load () , durchläuft aber auch alle Beziehungen des Modells , das die Methode aufruft , und lädt sie aus der Datenbank neu .
Standardmäßig lädt die load \ _ all-Methode nur das Modell , das direkt (in einem Schritt) mit dem Modell verknüpft ist , das die Methode aufruft .
Sie können jedoch den Parameter follow = true angeben , um das verschachtelte Modell zu durchlaufen und alle in den relationalen Baum zu laden .
Warnung Um eine wiederkehrende Aktualisierung mit der Einstellung follow = true zu vermeiden , speichert load \ _ all eine Gruppe von bereits besuchten Modellen und führt keine verschachtelten Ladevorgänge für bereits besuchte Modelle durch .
1 2 3 4 5 6 | |
Die Methode akzeptiert auch optionale Ausschlussparameter , die genau so funktionieren wie die Ausschlussfeldmethode in QuerySet , sodass Sie Felder aus dem verknüpften Modell löschen oder das gesamte zugehörige Modell überspringen können .
Eine Methode führt eine Datenbankabfrage aus und ist daher effizienter als verschachtelte Aufrufe von load () und all () im relationalen Modell .
!!!tip Um mehr über den Ausschluss zu erfahren , lesen Sie except \ _ fields
!!!Warnung Alle Beziehungen werden auf load \ _ all () gelöscht , so dass , wenn bestimmte verschachtelte Modelle ausgeschlossen werden , sie nach dem Aufruf leer bleiben .
Einsparungen ()
save () - > Selbsthilfe
Sie können ein neues Modell erstellen , indem Sie die QuerySet . create () - Methode verwenden oder das Modell als normales pydantisches Modell initialisieren und dann die save () - Methode aufrufen .
Mit save () können auch Änderungen am Modell gespeichert werden , sofern kein Primärschlüssel festgelegt ist oder das Modell nicht in der Datenbank vorhanden ist .
Die save () - Methode prüft nicht , ob das Modell in der Datenbank vorhanden ist , wenn also ein vorhandenes Modell mit einem bereits vorhandenen Primärschlüssel gespeichert werden soll , erhalten Sie einen Integritätsfehler vom ausgewählten Datenbank-Backend .
1 2 3 4 5 | |
aktualisiert ()
update(_columns: List[str] = None, **kwargs) -> self
Sie können das Modell mit der Methode QuerySet . update () aktualisieren oder die Modelleigenschaften (Felder) aktualisieren und die Methode update () aufrufen .
Wenn Sie versuchen , ein Modell zu aktualisieren , ohne einen Primärschlüssel festzulegen , wird eine ModelPersistenceError-Ausnahme ausgelöst .
Um ein neu erstelltes Modell dauerhaft zu speichern, verwenden Sie save () oder upsert ().**Die Kwars-Methode.
1 2 | |
Um nur die ausgewählten Spalten im Modell in der Datenbank zu aktualisieren , geben Sie eine Liste der Spalten an , die mit dem Parameter \ _ columns aktualisiert werden sollen .
In den Beispielen :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | |
!!!warnt davor , dass update () keine Instanz des Modells aktualisiert , wenn Sie also mehr Spalten ändern , als in der Liste " _ _ columns " eingegeben werden , weist Ihre Modelinstanz einen anderen Wert auf als die Datenbank !
Aktualisierung der Einfügungen ()
upsert (**kwargs) - > Selbstständig
Dies ist ein Proxy für die oben genannte save () oder update (**kwargs) Methode .
Wenn der Primärschlüssel auf-> gesetzt ist, wird die Aktualisierungsmethode aufgerufen.
Wenn pk nicht gesetzt ist, wird die save ()-Methode aufgerufen.
1 2 3 4 5 | |
Streichen ()
Sie können ein Modell löschen, indem Sie die QuerySet. delete ()-Methode verwenden oder Ihr Modell verwenden und die delete ()-Methode aufrufen.
1 2 | |
!!!Beachten Sie, dass das Tracking-Objekt unverändert bleibt und nur die Datensätze in der Datenbank gelöscht werden.
Erhaltung relevant)
save_related(follow: bool = False, save_all: bool = False, exclude=Optional[Union[Set, Dict]]) -> None
Eine Methode durchläuft alle Beziehungen des Modells, das die Methode aufruft, und ruft die upsert ()-Methode für jedes nicht gespeicherte Modell auf.
Um zu erfahren, wann das Modell gespeichert wird, sehen Sie sich den Abschnitt Speicherstatus oben an.
Standardmäßig speichert die save_lated-Methode nur das Modell, das direkt (einen Schritt entfernt) mit dem Modell verknüpft ist, das die Methode aufgerufen hat.
Sie können jedoch den Parameter follow = true angeben, um das verschachtelte Modell zu durchlaufen und alle in der relationalen Struktur zu speichern.
Standardmäßig speichert save_lated nur Modelle in einem nicht gespeicherten Zustand, was bedeutet, dass sie im aktuellen Umfang geändert wurden.
Wenn Sie das Speichern aller relevanten Methoden erzwingen möchten, verwenden Sie das Flag save_all = True, mit dem die Updates unabhängig von ihrem Speicherstatus in alle zugehörigen Modelle eingefügt werden.
Wenn Sie das Speichern bestimmter Beziehungen überspringen möchten, können Sie einen Ausschlussparameter übergeben.
Exclude kann entweder eine eigene Gruppe von Modellbeziehungen oder ein Wörterbuch sein, das verschachtelte Elemente enthalten kann.
!!!note Beachten Sie, dass Ausschlussparameter in save_lated nur relationale Feldnamen akzeptieren, also wenn Sie andere Felder übergeben, werden sie auf jeden Fall gespeichert
!!!Hinweis Um mehr über die Struktur zu erfahren, die an mögliche Werte für Ausschlüsse übergeben wird, lesen Sie die Dokumentation der Queryset. fields-Methode.
Warnung Um eine wiederkehrende Aktualisierung mit der Einstellung follow = true zu vermeiden, speichert save_lated eine Gruppe von besuchten Modellen auf jedem Zweig der relationalen Struktur und verschachtelt save_lated nicht auf bereits besuchten Modellen.
1 | |
Beachten Sie, dass Sie mit save_all = true und follow = true die Funktion save_lated () verwenden können, um den gesamten Beziehungsbaum auf einmal zu speichern.
Beispiele:
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 52 53 54 55 56 57 58 59 | |
Die Warnung save _ lated () durchläuft alle Beziehungen und alle Modelle einzeln und aktualisiert sie , so dass es alle Modelle speichert , aber in Bezug auf die Anzahl der Datenbankabfragen möglicherweise nicht optimal ist .