2011-03-19 2 views
1

Je cherche une solution "pythonique"/"ORM-ic" pour ce problème ...recherche relation approfondie

Modèle Soldier a ManyToManyField à lui-même.

class Soldier(models.Model): 
    ... 
    subordinates = models.ManyToManyField('Soldier', ...) 

A, B et C sont des objets Soldier

Ils forment sorte de "chaîne de commandement" comme ceci: A> B> C

B est en A.subordinates.all()
C est en B.subordinates.all()

Quelle est la meilleure façon d'obtenir tous les subordonnés de A?
Quelque chose comme A.get_all_subordinates(), qui devrait retourner [B, C].

Nous ne connaissons pas le nombre de niveaux de cette relation au moment de l'exécution. (C peut avoir des subordonnés de son propre, B peut avoir les frères et sœurs, etc.)

Répondre

2

Si vous modélisez le supérieur < -> relation subordonnée avec plusieurs à-plusieurs, vous vous retrouverez avec un graph- structure similaire pouvant être arbitrairement complexe (par exemple, des relations circulaires). Cela deviendra très difficile à interroger efficacement.

Si vous êtes après une structure arborescente (ce qui signifie que chaque Soldier a au plus un supérieur hiérarchique direct), vous pouvez utiliser django-mptt:

from django.db import models 
from mptt.models import MPTTModel 

class Soldier(MPTTModel): 
    parent = models.ForeignKey('self', null=True, blank=True) 

Obtenir tous les subordonnés est alors aussi facile que

subordinates = soldier.get_descendants() 

Et la meilleure chose à propos de get_descendants: il provoque exactement une requête pour obtenir tous les descendants.

Questions connexes