0

私は django-mptt 0.4.2 を使用していますが、データ ツリーの 1 つに問題があります。

これは mysql で見られるツリーです。

mysql> select id, lft,rght,level from my_object where tree_id=30613;
+-------+-----+------+-------+
| id    | lft | rght | level |
+-------+-----+------+-------+
| 89919 |   1 |   10 |     0 | 
| 89924 |  10 |   11 |     1 | 
| 89930 |   6 |    9 |     1 | 
| 90401 |   2 |    5 |     1 | 
| 90406 |   3 |    4 |     2 | 
| 90407 |   7 |    8 |     2 | 
+-------+-----+------+-------+

私のPythonシェルでは同じように見えます:

>>> obj = MyObject.objects.filter(tree_id=30613)
>>> for o in obj:
...     print "%5d %2d %2d %1d" % (o.id, o.lft, o.rght, o.level)
... 
89919  1 10 0
89924 10 11 1
89930  6  9 1
90401  2  5 1
90406  3  4 2
90407  7  8 2

問題は、django.mptt の .get_descendants() メソッドを使用する場合です。

>>> parent_node = MyObject.objects.get(id=89919)
>>> descendants = parent_node.get_descendants()
>>> for o in descendants:
...     print "%5d %2d %2d %1d" % (o.id, o.lft, o.rght, o.level)
... 
90401  2  5 1
90406  3  4 2
89930  6  9 1
90407  7  8 2


>>> print descendants.query # Formatted for readability
SELECT * FROM `my_obj` 
WHERE (
    `my_obj`.`lft` <= 9  
    AND `my_obj`.`lft` >= 2  
    AND `my_obj`.`tree_id` = 30613 
) ORDER BY `my_obj`.`tree_id` ASC, `my_obj`.`lft` ASC

django-mptt がすべての子孫を取得しないのはなぜですか?

4

1 に答える 1

2

ツリーは不正確な状態です:

parentnode:89919[left=1, right=10]含めることはできませんchildnode:89924[left=10, right=11]

クエリで確認できます。子ノードをleft >= 2 (paren_left+1)およびで検索しています。<= 9 (parent_right-1)

正しい結果を得るために、ツリーを再構築する必要がある場合があります。

move_to最近使いましたか?ここのメモを見てください: move_to(target, position='first-child')、関連している可能性があります。

同じ問題が発生する可能性があり、データベースでは更新されるがメモリでは更新されない親ノードをinset_at使用insert_atまたはmove_to提供する場合、これらのアクションのたびに親の新しいコピーを取得する必要があります。

詳細はこちら: last-child を使用した insert_node が正しく機能しない

于 2011-04-04T13:10:41.117 に答える