oogst-vocab is een Harvest Stack app biedt abstracte modellen voor het definiëren van de woordenschat-achtige modellen en het bouwen van een bijbehorende index voor hiërarchische zelf-gerelateerde gegevens.
Bijvoorbeeld, dit is hoe je modellen kunnen definiëren voor het opslaan ICD9 codes:
van vocab.models importeren AbstractItem, AbstractItemIndex
klasse Diagnose (AbstractItem):
& Nbsp; description = models.CharField (max_length = 50)
& Nbsp; code = models.CharField (max_length = 10)
& Nbsp; ouder = models.ForeignKey ('zelf', related_name = 'kinderen')
ICD9 codes zijn hiërarchische dus toen ik de vragen stellen, "Geef me alle patiënten met een diagnose in ICD9 367 (Aandoeningen van breking en accommodatie)", dan moet dit niet alleen query-367, maar alle afstammeling diagnoses en (waaronder andere 2 niveaus).
Dit soort vragen wordt het moeilijk om te schrijven, omdat je alleen toegang tot de directe ouder van de een bepaalde diagnose, waardoor de query zou uitzien.
van django.db.models import Q
Diagnosis.objects.filter (Q (code = '367') | Q (parent__code = '367'))
De voor de hand liggende probleem hier is dat elke diagnoses 2+ niveaus naar beneden van '367' zijn niet inbegrepen.
A Flat Index
Om dit probleem te verlichten, kan een AbstractItemIndex subklasse worden gedefinieerd die een vlakke index voor een AbstractItem subklasse zal bouwen. Definiëren het gewoon zo:
klasse DiagnosisIndex (AbstractItemIndex):
& Nbsp; punt = models.ForeignKey (Diagnose, related_name = 'item_indexes')
& Nbsp; ouder = models.ForeignKey (Diagnose, related_name = 'parent_indexes')
# Bouwt de index voor Diagnose
DiagnosisIndex.objects.index ()
De laatste regel genereert een flatscreen-index van de hiërarchie die de onbekende diepte kwestie verlicht. Dus nu kan dezelfde vraag hierboven vermeld worden beantwoord op deze manier:
# Ofwel het item heeft deze code of een van zijn ouders heeft deze code
voorwaarde = Q (item__code = '367') | Q (parent__code = '367')
item_ids = DiagnosisIndex.objects.filter (conditie) .values_list ('item__id', platte = True)
diagnoses = Diagnosis.objects.filter(id__in=item_ids)
Requirements:
- Python
Reacties niet gevonden