Django:如何在动态递归关系中获取所有实例?

时间:2016-04-09 17:06:34

标签: django django-models

我有一个定义为的模型:

Model A:
   parent = ForeignKey('self')

Model B:
   a = ForeignKey(A)

假设我有一些未定义的A级数据。

A1
|->A2
   |->A4->B1s
   |->A5->B2s
|->A3->B3s
...

如果我有A中的一个,我怎样才能让所有B都与之相关。

例如,给定A2,如何获得B1和B2。

如何从A1获得B1s,B2s,B3。

1 个答案:

答案 0 :(得分:1)

您正在寻找的数据结构称为" Tree" Django几乎没有很好的实现:django mpttdjango treebeard

准确回答您的问题:

  •   

    给定A2,如何获得B1和B2。 > B.objects.filter(Q(a__a=a2))

  •   

    如何从A1获得B1s,B2s,B3 ..> B.objects.filter(Q(a__a__a=a1) | Q(a__a=a1))

您甚至可以使用递归将简单(愚蠢)方法添加到模型中:

def get_all_children(self):
    result = []
    for child in B.objects.filter(a=self):
        result.append(child.get_all_children())
    return result

Django orm没有来自框的递归查询,我强烈建议使用django mptt或treebeard。