gpt4 book ai didi

django - 在 django-MPTT 中重新排序子节点

转载 作者:行者123 更新时间:2023-12-04 12:14:53 24 4
gpt4 key购买 nike

我正在使用 Ben Firshman 的 fork django-MPTT(对于 Daniel Roseman 的帽子提示 recommendation )。

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

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')

根据 docs on move_to ,我希望做我想做的事,但它似乎并没有改变任何东西。有时它似乎会移动 ids 中的第一项成为其 parent 的第一个 child ,有时不是。

我在阅读 move_to 的文档时是否正确?那个电话 move_to在一个节点上 nposition=rightn 的同级目标将移动 n要紧跟目标?

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

我误解了什么吗?

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

最佳答案

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

这样做的结果是,在您的代码中,每个 m移动到 last_m 的右侧- 但 last_m 中的值仍然反射(reflect)移动前的位置,因此下一步移动使用原始 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')

关于django - 在 django-MPTT 中重新排序子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2324727/

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