Django 博客 - 10 基于MPTT的评论

前言

上一篇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, rghttree_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 
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值