【问题标题】:depth relation search深度关系搜索
【发布时间】:2011-07-18 22:30:49
【问题描述】:

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

模型 Soldier 自身有一个 ManyToManyField。

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

ABCSoldier 对象

它们形成一种“命令链”,如下所示:A > B > C

BA.subordinates.all()
CB.subordinates.all()

获得A的所有下属的最佳方法是什么?
A.get_all_subordinates() 这样的东西应该返回[B, C]

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

【问题讨论】:

    标签: django orm django-orm


    【解决方案1】:

    如果你用多对多关系对上级 从属关系建模,你最终会得到一个可以变得任意复杂的类似图的结构(例如循环关系)。这将变得非常难以有效查询。

    如果你追求树状结构(这意味着每个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 最棒的一点是:它只导致一个查询获取所有后代。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      相关资源
      最近更新 更多