gpt4 book ai didi

Django-mptt 完全有问题还是我做错了?

转载 作者:行者123 更新时间:2023-12-02 11:45:07 25 4
gpt4 key购买 nike

我正在尝试使用django-mptt运气微乎其微。这是来自 svn 的最新 Python2.5、windows、sqlite3、Django 1.2pre、django-mptt。

代码:

型号:

class Node(models.Model):
name = models.CharField(max_length=20, blank=True)
parent = models.ForeignKey('self', null=True, blank=True, related_name='children')

def __unicode__(self):
return self.name

mptt.register(Node)

设置:

nodes = []
for i in range(15):
n = Node(name='node'+str(i))
n.save()
nodes.append(n)

nodes[0].move_to(None)
nodes[0].save()
for n in range(1,15):
nodes[n].move_to(nodes[(n-1)/2],'last-child')
nodes[n].save()

这应该创建一棵树,其中一个根和两个子节点卡在每个非叶节点上。

现在有趣的事情开始了:

>>> nodes[0].children.all()
[<Node: node1>, <Node: node2>]
>>> nodes[0].get_descendants()
[]

>>> nodes[0].get_descendants(True)
[<Node: node0>, <Node: node2>]


>>> for n in nodes:
... print n, n.get_ancestors()
...
node0 []
node1 [<Node: node0>]
node2 [<Node: node0>]
node3 [<Node: node0>, <Node: node2>]
node4 [<Node: node0>, <Node: node2>]
node5 [<Node: node0>, <Node: node2>]
node6 [<Node: node0>, <Node: node2>]
node7 [<Node: node0>, <Node: node2>, <Node: node6>]
node8 [<Node: node0>, <Node: node2>, <Node: node6>]
node9 [<Node: node0>, <Node: node2>, <Node: node6>]
node10 [<Node: node0>, <Node: node2>, <Node: node6>]
node11 [<Node: node0>, <Node: node2>, <Node: node6>]
node12 [<Node: node0>, <Node: node2>, <Node: node6>]
node13 [<Node: node0>, <Node: node2>, <Node: node6>]
node14 [<Node: node0>, <Node: node2>, <Node: node6>]

为什么这么多祖先都错了?例如,节点 10 应该有祖先,(0,1,10)

我做错了什么或者 django-mptt 中存在错误吗?

最佳答案

我不会说它有问题,但有一个你需要注意的问题。

当您向父级添加子级时,子级的树属性会使用 MPTT 特定的 lftrghtlevel 正确更新值。

但是,django-mptt 不会更新您所持有的父版本。数据库中的版本已更新,但本地变量中的副本未更新(请记住,Django 模型实例没有标识,因此当数据库或引用同一数据库行的其他实例更新时,不会更新) )。

这意味着您添加到父对象的下一个子对象将获得错误的左值和右值,并且如果您随后保存父对象,它也将具有错误的值。

解决方案是每次添加子项时从数据库重新加载父项:

for n in range(1,15):
parent_pos = (n-1)/2
parent = nodes[parent_pos]
nodes[n].move_to(parent, 'last-child')
nodes[n].save()
nodes[parent_pos] = Node.objects.get(pk=parent.pk)

关于Django-mptt 完全有问题还是我做错了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2152880/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com