我正在使用django-threadedcomments,但是这个问题通常也适用于对 QuerySet 进行排序。
QuerySet 中的评论对象有两个重要的字段,tree_path 和 submit_date。tree_path 的格式为“a/b/.../z”,其中“a”是树中的最高阶索引,“b”是树中的最低阶索引。因此,第一个根注释的 tree_path 将为“1”。该评论的子节点的 tree_path 为“1/1”。“1”的另一个孩子将有一个“1/2”的tree_path。第二个根注释的 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')
但这会破坏评论的线程。
有什么建议么?谢谢!