Django:简单层级的最佳方法?

3 投票
3 回答
1822 浏览
提问于 2025-04-16 07:56

我有一个模型:

class Category(models.Model):
    name = models.CharField()
    description = models.CharField(blank=True)
    parent = models.ForeignKey('self', blank=True, null=True)

我想让Django根据类别的层级来排序,比如说:

  • 父类 1
    • 子类 1
  • 父类 2
    • 子类 1

我做了一些研究,发现了两个应用,treebeard和Django MPTT,这两个都很强大,但可能会导致性能下降或者维护起来比较麻烦。

我会在网站的侧边栏和后台管理页面显示这些类别(在帖子模型中包含外键),对类别的添加、修改和删除会非常少,主要是读取,所以应该不会对性能有太大影响。

有没有其他更简单的应用可以实现这个功能?我能不能只用Django,不借助额外的应用,利用管理器或者其他方法来实现呢?

3 个回答

2

使用MPTT的目的是为了让系统运行得更快。当你自己实现这个功能时,可能需要手动把节点连接在一起(大约需要写30行代码),或者对每个子层级进行单独的查询。这会涉及很多手动操作,我也经历过。

而使用MPTT算法,你可以通过一次查询就获取到一个子树的数据。这是一种常用的算法,用来存储层级结构的数据。

Django的MPTT(特别是0.4版本)提供了一些很不错的接口,可以让你在后台和模板中正确地展示这些数据。你不需要重新发明轮子。

4

MPTT或者treebeard可能会导致性能变差?这根本就是胡说。使用这些工具的主要目的就是提供经过高度优化的算法,能够大幅度提升性能。MPTT让你可以通过一次数据库操作就获取整个树形结构或者它的某个部分,而如果不使用它,你可能需要进行很多次单独的操作。

4

我觉得使用像django-mptt这样的应用没有什么坏处。实际上,它提供的方法经过优化,可以在处理层级结构时让查询的性能达到最佳状态。所以我根本不需要担心维护性和性能问题,而且使用起来也很简单!

撰写回答