前言
上一篇Comment
模型有一个问题,当我们要获取一篇文章的所以评论时
需要通过parent
为空的Comment
对象,一级一级的通过commet.children.all()
获取
如果层级或者评论很多,需要对每一条评论都查询是否有回复,每一次查询都要对数据库查询,并且数据库查询都是相对很慢的
什么是MPTT
MPTT(Modified Preorder Tree Traversal)
是一种在数据库中存储层次结构的技术,它可以让相关操作更加高效
MPTT
使得大多数树操作在查询方面更高效。实际上,所有这些操作最多需要一个查询,有时为零:
- 获取节点的后代
- 获取节点的祖先
- 在给定的级别上获取所有节点
- 获取叶子节点
这个不需要再次查询数据库:
- 计算给定节点的后代的数量
使用MPTT
为了在评论模型里使用MPTT
,可以使用django-mptt
django-mptt
是一个帮助你在django模型中使用MPTT的应用
安装django-mptt
pip3 install django-mptt
将django-mptt
添加到INSTALLED_APPS
里
INSTALLED_APPS = (
# ...
'mptt',
)
创建评论模型,需要继承MPTTModel,并且有一个parent
字段
由于继承MPTTModel
,评论模型就有了level
,lft
, rght
和tree_id
字段,这些字段是MPTT
算法所使用的,一般不会用到
from mptt.fields import TreeForeignKey
from mptt.models import MPTTModel
class Comments(MPTTModel):
user = models.ForeignKey(User)
content = models.TextField()
parent = models.TreeForeignKey('self', null=True, blank=True, related_name='children',db_index=True)
post = models.ForeignKey(Post)
created_time = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.content
class MPTTMeta:
order_insertion_by