2

データベースから{% recursetree %} ツリー全体を取得せずに、 Django-MPTT を使用して部分ツリーを表示する方法はありますか? 深さ優先検索で検出された最初の 20 個のノードを表示する必要があります。

これらのいずれか (完全なツリーを取得しない) は、例外を引き起こします。

# resulting querySet passed to {% recursetree %} in template
Thing.objects.all()[:20]

# directly sliced in template
{% recursetree all_nodes|slice:":20" %} 

AssertionError while rendering: Cannot reorder a query once a slice has been taken.

一方、これは機能しますが、ツリー全体を取得します。

 # resulting querySet passed to {% recursetree %} in template
 list(Thing.objects.all())[:20]

DB からツリー全体を取得せずにこれを行うにはどうすればよいですか?

4

1 に答える 1

1

MPTT は pre-order を使用します (これはすでに深さ優先検索です)。そのため、recursetree に渡す前にクエリセットに制限を追加するだけです。

order_by()にクエリセットを渡すと MPTT が呼び出されrecursetreeますが、リストを渡すとそれができません。その振る舞いは一種の混乱を招き、他の人にも問題を引き起こしています.

これに対処するために MPTT でチケットを作成しました。

それまでは、list() 呼び出しの前にスライスを行うことができます。

list(Thing.objects.all()[:20])

これにより、データベースで制限が行われ、クエリセットがリストに変換されます。これrecursetreeにより、並べ替えを試みることなく渡すことができます。

于 2013-11-24T20:41:32.353 に答える