Ga naar inhoud

Uitgestelde opmerking

zelfrefererend model

Als u tijdens de declaratie naar hetzelfde model wilt verwijzen om een relatie te creëren, moet u het model waarnaar wordt verwezen declareren als ForwardRef, omdat de klasse niet gereed is tijdens de declaratie en Python u er niet standaard naar laat verwijzen.

Hoewel u misschien toekomstige annotaties wilt gebruiken of gewoon naar namen wilt verwijzen met ', werkt het niet omdat ormar bedoeld is om te worden gebruikt met expliciet gedeclareerde ForwardRef.

Eerst moet u de vereiste referenties uit de invoer importeren.

1
ForwardRef importeren uit typen

Nu hebben we een voorbeeldmodel nodig en een verwijzing naar hetzelfde model, dat zal worden gebruikt om een zelfreferentiële relatie te creëren.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# Persoon die de forwardref naar model maakt
PersonRef = ForwardRef ("Persoon")


Klasse Persoon (ormar. Model):
    ormar _ config = basis _ ormar _ config kopie ()

    Id: int = ormar. Geheel getal (primaire _ sleutel = waar)
    Naam: str = ormar. String (max _ length = 100)
    # gebruik de forwardref als parameter om
    Supervisor: PersonRef = ormar. ForeignKey (PersonRef, gerelateerde _ naam = "werknemers")

Zo simpel is het. Maar voordat u het model gebruikt, moet u de referenties handmatig bijwerken, zodat ze het daadwerkelijke model genereren.

!!!-waarschuwing Als u een model probeert te gebruiken zonder de referentie bij te werken, wordt een ModelError-uitzondering gegenereerd. Daarom zal in het bovenstaande voorbeeld elke aanroep zoals de volgende resulteren in een uitzondering 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()

Om referenties bij te werken, roept u de update\ _ forward\ _ refs-methode op elk model met forward-referenties alleen aan nadat u alle gerelateerde modellen hebt gedeclareerd.

Om ons vorige voorbeeld goed te laten werken, hebben we daarom alleen een extra lijn nodig.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
PersonRef = ForwardRef ("Persoon")


Klasse Persoon (ormar. Model):
    ormar _ config = basis _ ormar _ config kopie ()

    Id: int = ormar. Geheel getal (primaire _ sleutel = waar)
    Naam: str = ormar. String (max _ length = 100)
    Supervisor: PersonRef = ormar. ForeignKey (PersonRef, gerelateerde _ naam = "werknemers")


Persoon. update _ forward _ refs ()

Natuurlijk kan voor de heen en weer parameters dezelfde bewerking op precies dezelfde manier worden uitgevoerd op de ManyToMany-relatie.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# de referentie verklaren
ChildRef = ForwardRef ("Kind")

Klasse Kindervriend (ormar. Model):
    ormar _ config = basis _ ormar _ config kopie ()

Klasse Kind (ormar. Model):
    ormar _ config = basis _ ormar _ config kopie ()

    Id: int = ormar. Geheel getal (primaire _ sleutel = waar)
    Naam: str = ormar. String (max _ length = 100)
    # gebruik het in relatie
    Vrienden = ormar. ManyToMany (ChildRef, door = ChildFriend,
                               gerelateerde _ naam = "ook _ vrienden")


Jeugd. update _ forward _ refs ()

cross-model relatie

Dezelfde mechanismen en logica als een zelfreferentiemodel kunnen worden gebruikt om meerdere verschillende modellen aan elkaar te koppelen.

Natuurlijk zal ormar een omgekeerde relatie creëren voor beide kanten van uw linkrelatie met behulp van de opgegeven (of standaard) gerelateerde\ _ naam.

Als u echter twee (of meer) relaties tussen twee modellen nodig heeft, om welke reden dan ook, moet die relatie aan beide kanten worden opgeslagen (dus verklaar de ene relatie op het ene model en de andere op het tweede), u moet ForwardRef gebruiken om te bereiken dat.

Bekijk het volgende eenvoudige voorbeeld.

 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
# leraar is nog niet gedefinieerd
TeacherRef = ForwardRef ("Leraar")


Klassestudent (ormar. Model):
    ormar _ config = basis _ ormar _ config kopie ()

    Id: int = ormar. Geheel getal (primaire _ sleutel = waar)
    Naam: str = ormar. String (max _ length = 100)
    # dus we gebruiken referenties in plaats van echte modellen
    primaire _ leraar: TeacherRef = ormar. ForeignKey (TeacherRef,
                                                   gerelateerde _ naam = "eigen _ studenten")


Klasse StudentLeraar (ormar. Model):
    ormar _ config = basis _ ormar _ config (tabelnaam = 'studenten _ x _ docenten')


Klassenleraar (ormar. Model):
    ormar _ config = basis _ ormar _ config kopie ()

    Id: int = ormar. Geheel getal (primaire _ sleutel = waar)
    Naam: str = ormar. String (max _ length = 100)
    # we hebben studenten nodig voor andere relaties, vandaar de volgorde
    Studenten = ormar. ManyToMany (Student, through=StudentTeacher,
                                gerelateerde _ naam = "docenten")

# nu het Teacher-model al is gedefinieerd, kunnen we referenties bijwerken
Student. bijwerken _ doorsturen _ refs ()

!!! Waarschuwing Onthoud dat ongeacht hoeveel relaties zijn gedefinieerd, de gerelateerde\ _ naam uniek moet zijn in het gerelateerde model.