无限级嵌套评论:基于 MPTT 的时间戳排序与分页
利用 django-mptt 实现高性能的树形评论,并解决“按时间排序但保持父子关系”的经典难题。 · 难度:入门 · +10XP
无限级嵌套评论:基于 MPTT 的时间戳排序与分页
普通教程用外键自关联做评论,递归查询导致性能灾难。本教程使用 MPTT(Modified Preorder Tree Traversal)模式,一次查询即可获取整个评论树。重点解决:如何在保持树结构完整的前提下,按最新评论排序(将根节点按创建时间倒序,子节点按正序)。同时实现懒加载分页——点击“回复”才展开子评论,通过 AJAX 加载下一级。最后讲解 MPTT 的插入/移动/删除对树结构的维护。
from mptt.models import MPTTModel, TreeForeignKey
class Comment(MPTTModel):
body = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
parent = TreeForeignKey(
'self', on_delete=models.CASCADE,
null=True, blank=True, related_name='children'
)
class MPTTMeta:
order_insertion_by = ['created_at']
# 获取所有根评论并按最新排序
root_comments = Comment.objects.filter(
parent__isnull=True
).order_by('-created_at')