new_querysetこのアプローチには2つの問題があります。互いに隣り合っていないブランチがある場合(つまり実際には機能しない場合)、失敗します。最終的なクエリではnumber_of_trees*number_of_levels節があるため非常に効率が悪く、非常に高速になる可能性があります私は先祖をどこかにキャッシュすることにはオープンしていますが、効率的なやり方を考えることはできません。(私はMySQLにあります)を実行することを考えましたが、それは巨大/低速になる可能性があると思います。new_querysetそれでもlen(queryset)節です。クエリーセット内の他のオブジェクトの祖先であるオブジェクトを削除する前処理パスを実行することによって、句の数を少し減らすことができます。min_obj_set.append(obj)上記のスニペットは一例に過ぎませんが、あなたのクエーセットにかなりの量のオブジェクトが含まれている場合は、おそらくBSTを使用することになります。これが大規模なDBクエリと比較してスピードの向上をもたらすかどうかをテストする必要があります。私は一度同様のアルゴリズムを書く必要があった。私はMPTTツリーを表示するビューを持っていた、それは非常に大きなツリーだったので、HTMLテンプレートにすべてのデータをロードすることができませんでした。そこで、最初のロードでルートノードのみを表示し、他のノードをロードするためにAjaxを使用しました。私の上司が「検索」オプションを実装するように依頼するまではうまくいっていました。検索では、すべてのノードを調べ、マッチが見つかったときにツリーを爆発させなければならなかった。これを理解するにはしばらく時間がかかりましたが、ついにそれを得ました。YourModel.objects.filter(query)実行するクエリーは2つだけ必要です。最初のqsは引数として渡され、最後のクエリーセットは関数によって返されます。tree_listは、すでにtree_list追加されているノードを保存する辞書です。最適化されているため、アルゴリズムが動作する必要はありません。私は相対的に大きな木で作業していたので、それを含めなければなりませんでした。私はあなたがこのメソッドをマネージャーにしてより一般的なものにすることができると思います。mptt名前(文字列)を使ってモジュールの関数を呼び出すフラットテーブルをツリーに解析する最も効率的でエレガントな方法は何ですか?関数内でのグローバル変数の使用Djangoビューで2つ以上のクエリーセットを結合するには?どのようにDjangoクエリーセットのフィルタリングで等しくないのですか?どのように関数デコレータのチェーンを作る?日本語Top。