Я понимаю, что прошло немного времени с тех пор, как вы отправили сообщение ... поэтому вы можете получить ответ к этому моменту или, возможно, вы ушли. Независимо от того, вы идете ...:)
Вы неправильно понимаете структуру tree_path в приложении django-threadadedcomments. Tree_path никогда не будет равным 1/1, поскольку каждый сегмент пути является уникальным первичным ключом этого ThreadedComment.
Если вы начнете с ThreadedComment 1
и добавите ответ, вы получите путь 1/2
. Затем, если вы добавите дополнительный пост верхнего уровня, он получит путь 3
. Это даст вам:
1
1/2
3
И если вы ответите на первый пост снова, вы получите:
1
1/2
1/4
3
Теперь для решения проблемы сортировки. Я попытался сделать подобную сортировку (по результатам голосования, аналогично reddit), и не нашел простого способа сделать это. Тем не менее, вот рекурсивный метод, который вы можете использовать: (Это уродливо и медленно ... но это отправная точка)
def sort_comments(tree):
final_tree = []
root_comments = [c for c in tree if c.tree_path.count('/') == 0]
root_comments.sort(key=lambda comment: comment.submit_date, reverse=True)
for comment in root_comments:
final_tree.append(comment)
append_and_sort_children(final_tree, tree, comment)
return final_tree
def append_and_sort_children(final_tree, tree, parent):
children = [c for c in tree if c.parent_id == parent.id]
children.sort(key=lambda comment: comment.submit_date, reverse=True)
for comment in children:
final_tree.append(comment)
append_and_sort_children(final_tree, tree, comment)
Используя это, просто передайте весь свой набор комментариев к этой модели, и python отсортирует их для вас. :)
Это даст вам окончательный результат:
3
1
1/4
1/2
Если у кого-то есть способ сократить это, не стесняйтесь внести свой вклад.