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 | |
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 | |
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 | |
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 | |
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 | |
!!! Waarschuwing Onthoud dat ongeacht hoeveel relaties zijn gedefinieerd, de gerelateerde\ _ naam uniek moet zijn in het gerelateerde model.