Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django-线程注释的排序查询集_Django_Sorting_Comments_Django Queryset_Threaded Comments - Fatal编程技术网

Django-线程注释的排序查询集

Django-线程注释的排序查询集,django,sorting,comments,django-queryset,threaded-comments,Django,Sorting,Comments,Django Queryset,Threaded Comments,我正在使用,但是这个问题通常也适用于对查询集进行排序 QuerySet中的comment对象有两个重要字段,tree_path和submit_date。树路径的形式为“a/b/../z”,其中“a”是树中的最高阶索引,“b”是树中的最低阶索引。因此,第一个根注释的树路径为“1”。该注释的子项将具有“1/1”的树路径。“1”的另一个子级的树路径为“1/2”。第二个根注释的根路径为“2”,以此类推 QuerySet“qs”的排序如上所述,注释按线程顺序排列,最早的注释位于顶部。上面示例中的树路径看起

我正在使用,但是这个问题通常也适用于对查询集进行排序

QuerySet中的comment对象有两个重要字段,tree_path和submit_date。树路径的形式为“a/b/../z”,其中“a”是树中的最高阶索引,“b”是树中的最低阶索引。因此,第一个根注释的树路径为“1”。该注释的子项将具有“1/1”的树路径。“1”的另一个子级的树路径为“1/2”。第二个根注释的根路径为“2”,以此类推

QuerySet“qs”的排序如上所述,注释按线程顺序排列,最早的注释位于顶部。上面示例中的树路径看起来就像[1,1/1,1/2,2]。我想先用最新的评论对每个级别的评论进行排序。因此查询集应该是[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')
但这破坏了评论的线程化


有什么建议吗?谢谢

我意识到这已经有一段时间没有你发帖了。。所以你现在可能已经有了答案,或者你已经离开了。不管怎样,给你……:)

您误解了django threadedcomments应用程序中的树路径结构。永远不会有1/1的树路径,因为每个路径段都是ThreadedComment的唯一主键

如果以ThreadedComment
1
开头并添加回复,则会得到路径
1/2
。然后,如果您添加一个额外的顶级帖子,它将获得路径
3
。这将给你:

1
1/2
3
如果你再次回复第一篇帖子,你会得到:

1
1/2
1/4
3
现在来解决排序问题。我尝试过做类似的排序(通过投票分数,类似于reddit),但没有找到简单的方法。然而,这里有一个可以使用的递归方法:(它很难看,而且很慢……但它是一个起点)

使用此方法,只需传入该模型的整个查询注释集,python就会为您排序。:)

这将为您提供以下方面的最终结果:

3
1
1/4
1/2

如果有人有办法缩短这段时间,请随意投稿。

我意识到这已经有一段时间了,因为你发布了。。所以你现在可能已经有了答案,或者你已经离开了。不管怎样,给你……:)

您误解了django threadedcomments应用程序中的树路径结构。永远不会有1/1的树路径,因为每个路径段都是ThreadedComment的唯一主键

如果以ThreadedComment
1
开头并添加回复,则会得到路径
1/2
。然后,如果您添加一个额外的顶级帖子,它将获得路径
3
。这将给你:

1
1/2
3
如果你再次回复第一篇帖子,你会得到:

1
1/2
1/4
3
现在来解决排序问题。我尝试过做类似的排序(通过投票分数,类似于reddit),但没有找到简单的方法。然而,这里有一个可以使用的递归方法:(它很难看,而且很慢……但它是一个起点)

使用此方法,只需传入该模型的整个查询注释集,python就会为您排序。:)

这将为您提供以下方面的最终结果:

3
1
1/4
1/2

如果有人有办法缩短这个时间,请随意贡献。

首先只选择根注释,对其排序,然后选择子注释并对其排序,最后将两个集连接起来,怎么样?这样行吗?

首先只选择根注释,对它们进行排序,然后选择子注释,对它们进行排序,最后将这两个集连接起来,怎么样?这样行吗