7

我正在使用 Ben Firshman 的django-MPTT 分支(Daniel Roseman建议)。

我一直试图重新排序共享一个共同父节点的节点。我有一个主键列表,如下所示:

ids = [5, 9, 7, 3]

所有这些节点都有一个父节点,比如主键 1。

目前,这些节点是有序的[5, 3, 9, 7],我怎样才能将它们重新排序[5, 9, 7, 3]

我试过这样的事情:

last_m = MyModel.get(pk = ids.pop(0))
last_m.move_to(last_m.parent, position='first-child')

for id in ids:
  m = MyModel.get(pk = id)
  m.move_to(last_m, position='right')

根据 上的文档move_to,我希望做我想做的事,但它似乎并没有改变任何东西。有时它似乎将第一项移入ids其父项的第一个子项,有时则不然。

我在阅读文档中是否正确地move_to调用move_to了一个节点和一个目标,该目标是一个兄弟节点n,将立即移动到目标之后?position=rightnn

有可能我在试图弄清楚这一点时搞砸了我的模型表,所以也许上面的代码实际上是正确的。也有可能有一种更优雅的方式来执行此操作(可能不涉及O(n)选择和O(n)更新)。

我误解了什么吗?

额外的问题:有没有办法强制 django-MPTT 为给定模型的所有实例重建lft和赋值?rght

4

1 回答 1

6

我认为这是我之前提到的 MPTT 失败的产物——当你移动节点时,它会正确更新你正在移动的节点的实例,但它不会更新目标的实例(尽管它确实在数据库中更新)。

这样做的结果是,在您的代码中,每个都m被移动到右侧last_m- 但是中的值last_m仍然反映移动之前的位置,因此下一步使用原始 lft/right 值而不是新的移动后值.

last_m解决方案是每次重新加载:

for id in ids:
  last_m = MyModel.objects.get(pk=last_m.id)
  m = MyModel.get(pk = id)
  m.move_to(last_m, position='right')
于 2010-02-24T14:22:20.887 回答