Zum Inhalt

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
from typing import forwardRef (Eingabeaufforderung)

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
#Erstellen Sie die ForwardRef für Model Persons
PersonRef = ForwardRef ("Person") Bearbeiten


Klasse Person (ormar. model):
    ormar_config = base_ormar_config. copy ()(= Grundeinheit von ormar_config. copy)

    id: int = ormar. Integer (primary_key = true)(nicht bekannt)
    name: str = ormar. String (max_length = 100)[Bearbeiten | Quelltext bearbeiten]
    Verwenden Sie die Vorwärtsref als Parameter
    supervisor: PersonRef = ormar. ForeignKey (PersonRef, related_name ="employees")

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
PersonRef = ForwardRef ("Person") Bearbeiten


Klasse Person (ormar. model):
    ormar_config = base_ormar_config. copy ()(= Grundeinheit von Ormar_config. copy)

    id: int = ormar. Integer (primary_key = true)(nicht bekannt)
    name: str = ormar. String (max_length = 100)[Bearbeiten | Quelltext bearbeiten]
    supervisor: PersonRef = ormar. ForeignKey (PersonRef, related_name ="employees")


update_forward_refs ()(Aktualisiert_forward_refs)

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
#Empfehlung der Referenz
ChildRef = ForwardRef ("Kinder")

Klasse Kinderfreund (ormar.
    ormar_config = base_ormar_config. copy ()(= Grundeinheit von ormar_config. copy)

Klasse Kind (ormar. -Modell):
    ormar_config = base_ormar_config. copy ()(= Grundeinheit von ormar_config. copy)

    id: int = ormar. Integer (primary_key = true)(nicht bekannt)
    name: str = ormar. String (max_length = 100)[Bearbeiten | Quelltext bearbeiten]
    Verwenden Sie es in Bezug
    ManyToMany (ChildRef, durch = ChildFriend,
                               related_name ="auch_freunde")


Aktualisiert_forward_refs ()

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
Lehrer sind noch nicht definiert
ForwardRef ("Lehrer")


Klasse Schüler (ormar.
    ormar_config = base_ormar_config. copy ()(= Grundeinheit von Ormar_config. copy)

    id: int = ormar. Integer (primary_key = true)(nicht bekannt)
    name: str = ormar. String (max_length = 100)
    So verwenden wir Referenzen unabhängig vom tatsächlichen Modell
    primary_teacher: TeacherRef = ormar. ForeignKey (TeacherRef, Lehrer)
                                                   related_name ="eigene_students")


Klasse Lehrer (ormar.
    ormar_config = base_ormar_config. copy (tablename ='students_x_teachers')(nur auf Englisch)


Klasse Lehrer (ormar. Modell):
    ormar_config = base_ormar_config. copy ()(= Grundeinheit von ormar_config. copy)

    id: int = ormar. Integer (primary_key = true)(nicht bekannt)
    name: str = ormar. String (max_length = 100)
    #Wir brauchen Studenten für eine andere Beziehung zu Hence the Order
    ManyToMany (Student, durch = Student Teacher,
                                related_name ="Lehrer")

Jetzt ist das Teachermodell bereits definiert, wir können Referenzen aktualisieren
update_forward_refs ()[Bearbeiten]

Achtung: Unabhängig davon, wie viele Beziehungen definiert sind, muss related_name in einem relationalen Modell eindeutig sein.