有两个著名的 Django 包用于创建树结构:django-treebeard和django-mptt。最近Django CMS开始使用 django-treebeard 代替 django-mptt。Wagtail CMS也在使用 django-treebeard。
是什么让 django-treebeard 成为比 django-mptt 更可取的选择?
有两个著名的 Django 包用于创建树结构:django-treebeard和django-mptt。最近Django CMS开始使用 django-treebeard 代替 django-mptt。Wagtail CMS也在使用 django-treebeard。
是什么让 django-treebeard 成为比 django-mptt 更可取的选择?
主要区别在于 SQL 树实现的选择。
django-mptt 使用嵌套集,读取速度快,写入速度慢。
Treebeard 提供嵌套集,以及邻接列表(快速写入、慢速读取)和物化路径(快速读取、快速写入)。
还有其他区别。django-mptt 有更好的 API 和更好的文档。
最重要的django-mptt
是,明确未维护:
https://github.com/django-mptt/django-mptt#this-project-is-currently-unmaintained
因此,在这一点上,使用django-mptt
会带来很大的风险,即您将无法使用其他软件包的当前版本(取决于 django-mptt),并且最终会遇到需要您切换到不同软件包的问题,例如django-treebeard
.
顺便说一句,对于 Postgres 用户,还有另一个有趣的 mptt 替代方案:(ltree
https://www.postgresql.org/docs/current/ltree.html )。
目前(在我写这篇文章的时候),没有用于ltree
与 Django 集成的维护包。但是,django-treebeard 在添加 ltree 支持方面存在一个未解决的问题:https ://github.com/django-treebeard/django-treebeard/issues/170
同时,它很容易在没有包的情况下实现。这是我找到的一个演示:https ://github.com/peopledoc/django-ltree-demo 。我可以确认这个演示仍然运行良好(即使代码已经有几年了)。
您可以使用 treebeard 获得更多选项,它允许使用相同 API 实现多个树。
TREEBEARD: Adjacency List, Materialized Path, & Nested Sets
MPTT: NESTED sets
此外,MPTT 在涉及超过 1000 个节点的大树操作中可能会较慢,所以我认为项目规模应该考虑到您的考虑因素。
有关更多信息,请查看 TREEBEARD 维护者之一 Jacob Rief 的DjangoCon Talk。演讲是关于“Representing Hierarchies in Relational Databases”查看他的GitHub