深度关系搜索

时间:2011-03-19 22:49:38

标签: django orm django-orm

我正在为这个问题寻找一个“pythonic”/“orm-ic”解决方案......

模型Soldier自身有一个ManyToManyField。

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

ABCSoldier个对象

他们形成一种“指挥链”,如下所示:A> B> ç

B位于A.subordinates.all()C位于B.subordinates.all()

获取A所有下属的最佳方法是什么? 类似于A.get_all_subordinates()的内容,应返回[B, C]

我们不知道在运行时有多少级别的这种关系。 (C可以拥有自己的一些下属,B可以有兄弟姐妹等。)

1 个答案:

答案 0 :(得分:2)

如果您对上级< - >进行建模与多对多关系的从属关系,你最终会得到一个可以得到任意复杂的图形结构(例如循环关系)。这将很难有效地查询。

如果您正在使用树状结构(这意味着每个Soldier最多只有一个直接上级),您可以使用django-mptt

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

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

获得所有下属就像

一样简单
subordinates = soldier.get_descendants()

关于get_descendants的最好的事情:它只会导致一个查询来获取所有后代。