私はdjango-threadedcommentsを使用していますが、質問は一般的に QuerySet のソートにも当てはまります。
QuerySet のコメント オブジェクトには、tree_path と submit_date という 2 つの重要なフィールドがあります。tree_path の形式は「a/b/.../z」です。「a」はツリーの最上位のインデックスで、「b」はツリーの最下位のインデックスです。したがって、最初のルート コメントの tree_path は「1」になります。そのコメントの子には、「1/1」の tree_path があります。「1」の別の子には、「1/2」の tree_path があります。2 番目のルート コメントの root_path は「2」などになります。
QuerySet "qs" は上記のようにソートされ、コメントはスレッド順に並べられ、最も古いコメントが一番上になります。上記の例の tree_paths だけでは、[1, 1/1, 1/2, 2] のようになります。コメントの各レベルを最新のコメントから順に並べ替えたいと思います。そのため、代わりに QuerySet を [2, 1, 1/2, 1/1] にする必要があります。
これどうやってするの?
以下を使用して、ルート レベルのコメントだけを並べ替えることができます。
qs = qs.extra(select={ 'tree_path_root': 'SUBSTRING(tree_path, 1, 1)' })
.order_by('%stree_path_root' % ('-'), 'tree_path')
しかし、ルート以外のコメントを同時にソートする方法がわかりません。私は次のようなことを試しました:
qs = qs.extra(select={ 'tree_path_root': 'SUBSTRING(tree_path, 1, 1)'
'tree_path_sec' : 'SUBSTRING(tree_path, 3, 1)'})
.order_by('%stree_path_root' % ('-'), '%stree_path_sec' % ('-'), 'tree_path')
しかし、それはコメントのスレッド化を破壊します。
助言がありますか?ありがとう!