我正在为这个问题寻找一个“pythonic”/“orm-ic”解决方案......
模型Soldier
自身有一个ManyToManyField。
class Soldier(models.Model):
...
subordinates = models.ManyToManyField('Soldier', ...)
A
,B
和C
是Soldier
个对象
他们形成一种“指挥链”,如下所示:A> B> ç
B
位于A.subordinates.all()
中
C
位于B.subordinates.all()
获取A
所有下属的最佳方法是什么?
类似于A.get_all_subordinates()
的内容,应返回[B, C]
。
我们不知道在运行时有多少级别的这种关系。 (C
可以拥有自己的一些下属,B
可以有兄弟姐妹等。)
答案 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
的最好的事情:它只会导致一个查询来获取所有后代。