colheita-vocab é um aplicativo Colheita Stack fornece modelos abstratos para a definição de modelos de vocabulário-like e construir um índice correspondente a autocorreção de dados relacionados hierárquicos.
Por exemplo, esta é a forma como você pode definir modelos para guardar códigos ICD9:
de vocab.models importar AbstractItem, AbstractItemIndex
classe Diagnosis (AbstractItem):
& Nbsp; description = models.CharField (max_length = 50)
& Nbsp; code = models.CharField (max_length = 10)
& Nbsp; parent = models.ForeignKey ('self', related_name = "crianças")
Códigos ICD9 são hierárquicas, portanto, quando eu fazer as perguntas: "Dê-me todos os pacientes que têm um diagnóstico em ICD9 367 (Distúrbios da refração e alojamento)", então este deve não só consulta 367, mas todos os diagnósticos descendentes bem (o que inclui mais 2 níveis).
Este tipo de consulta torna-se difícil de escrever desde que você só tem acesso à controladora direta da um diagnóstico particular, portanto, a consulta ficaria assim.
de django.db.models importação Q
Diagnosis.objects.filter (Q (code = '367') | Q (parent__code = '367'))
O problema óbvio aqui é que qualquer diagnóstico 2+ níveis abaixo de '367' não estão incluídos.
criar um índice Plano
Para minimizar esse problema, uma subclasse AbstractItemIndex pode ser definido que irá construir um índice de plano para uma subclasse AbstractItem. Basta defini-lo como este:
classe DiagnosisIndex (AbstractItemIndex):
& Nbsp; item = models.ForeignKey (Diagnóstico, related_name = 'item_indexes')
& Nbsp; parent = models.ForeignKey (Diagnóstico, related_name = 'parent_indexes')
# Constrói o índice para Diagnóstico
DiagnosisIndex.objects.index ()
A última linha gera um índice de plano da hierarquia que alivia o problema profundidade desconhecida. Então, agora, a mesma pergunta acima enunciado pode ser respondida da seguinte forma:
# Quer o item tem este código ou um de seus pais tem esse código
condition = Q (item__code = '367') | Q (parent__code = '367')
item_ids = DiagnosisIndex.objects.filter (condição) .values_list ('item__id', flat = True)
diagnósticos = Diagnosis.objects.filter(id__in=item_ids)
Requirements:
- Python
Comentários não encontrado