2015-11-05 62 views
0

我有一個代表樹的邊緣上的Django模型,並表示該節點的模型:Django的select_related樹路

class Edge(models.Model): 
nodeFrom = models.ForeignKey('Node', related_name='+') 
nodeTo = models.ForeignKey('Node', related_name='+') 

class Node(models.Model): 
    id = models.AutoField(primary_key=True) 
    name = models.TextField() 
    parentNode = models.ForeignKey('Node', null=True) 

是否有搭建的樹路徑的樹只有一個數據庫命中的方法嗎?

我嘗試這樣做:

userEdges = Edge.objects.filter(nodeFrom__in=userNodes, nodeTo__in=userNodes).select_related('nodeFrom', 'nodeTo) 

,但如果我嘗試建立這樣的路徑,

def get_path(node, userEdges): 
    path = [node] 
    while path[-1].parentNode_id != None: 
     path.append(userEdges.get(nodeTo=node).nodeFrom) 

    return path 

數據庫訪問總是由該行造成的:

userEdges.get(nodeTo=node).nodeFrom 

回答

1

那是因爲你使用.get。由於您已經檢索了userEdges並將它們存儲在內存中,因此您可以這樣做:

while ... : 
    currentEdge = next(e for e in userEdges if e.nodeTo == node) 
    path.append(currentEdge.nodeFrom)