Notiz verschieben.
Das selbst zitierte Modell
Wenn Sie das gleiche Modell während der Deklaration referenzieren möchten, um eine Beziehung zu erstellen, müssen Sie das referenzierte Modell als ForwardRef deklarieren, da die Klasse während der Deklaration noch nicht bereit ist und Sie in Python standardmäßig nicht darauf verweisen können.
Auch wenn Sie vielleicht einen zukünftigen Kommentar verwenden oder einfach mit "" auf einen Namen verweisen möchten, wird dies nicht funktionieren, da ormar für die Verwendung mit explizit deklarierter ForwardRef vorgesehen ist.
Zuerst müssen Sie den gewünschten Verweis aus der Eingabe importieren.
1 | |
Jetzt benötigen wir ein Beispielmodell und einen Verweis auf dasselbe Modell, das zum Erstellen von selbstreferenziellen Beziehungen verwendet wird.
1 2 3 4 5 6 7 8 9 10 11 | |
Das ist so einfach, aber bevor Sie mit den Modellen arbeiten, müssen Sie die Referenzen manuell aktualisieren, damit sie die tatsächlichen Modelle erzeugen.
!!!Warnung Wenn Sie versuchen, ein Modell ohne Aktualisierungsreferenz zu verwenden, wird eine ModelError-Ausnahme ausgelöst Daher führt jeder Aufruf wie der folgende im obigen Beispiel zur Ausnahme python # creation of model - exception await Person.objects.create(name="Test") # initialization of model - exception Person2(name="Test") # usage of model's QuerySet - exception await Person2.objects.get().
Um Referenzen zu aktualisieren, rufen Sie die update_forward_refs-Methode auf jedem Modell mit Vorwärtsreferenzen auf, nur nachdem alle zugehörigen Modelle deklariert wurden.
Damit unser vorheriges Beispiel funktioniert, benötigen wir nur eine zusätzliche Zeile.
1 2 3 4 5 6 7 8 9 10 11 12 | |
Natürlich kann für die Parameter to und through dieselbe Operation mit der ManyToMany-Beziehung auf genau die gleiche Weise durchgeführt werden.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
Intermodale Beziehung
Dieselben Mechanismen und Logiken wie das selbstreferenzierende Modell können verwendet werden, um mehrere verschiedene Modelle miteinander zu verknüpfen.
Natürlich erstellt ormar eine Inverse für beide Seiten der Beziehung, die Sie verknüpfen, mit dem angegebenen (oder voreingestellten) related_name.
Wenn Sie jedoch zwei (oder mehr) Beziehungen zwischen zwei Modellen benötigen, die aus welchem Grund auch immer auf beiden Seiten gespeichert werden sollten (also eine Beziehung auf einem Modell und die andere auf dem zweiten), müssen Sie dies mit ForwardRef erreichen.
Siehe das einfache Beispiel unten.
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 | |
Achtung: Unabhängig davon, wie viele Beziehungen definiert sind, muss related_name in einem relationalen Modell eindeutig sein.