Django:简单层次结构的最佳方式?

时间:2010-12-02 11:12:39

标签: python django hierarchy django-mptt

我有这个型号:

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

我做了一些研究,发现了2个应用程序,treebeard.al_tree和Django MPTT,两者都很强大,可能导致性能降低或难以维护。

我将在网站的侧边栏和内部管理页面中显示类别(在帖子模型中包含ForeignKey),对类别的添加/修改/删除非常少,大多数只读取对性能没有太大影响。

是否还有其他应用提供此功能并且比上述功能更简单? 我可以使用Django在没有其他应用程序的情况下使用管理器或其他东西来实现这一目标吗?

3 个答案:

答案 0 :(得分:4)

我没有看到任何使用像django-mptt这样的应用程序的disadvantes。事实上,它提供的方法经过优化,可以在使用分层结构进行查询时提供最大的性能。我没理由担心可维护性和/或性能而且非常容易使用!

答案 1 :(得分:4)

MPTT或treebeard可能导致更低的性能?废话。这些应用程序的重点在于它们提供高度优化的算法,大大提高性能。 MPTT允许您通过单个数据库操作获取整个树或其子部分,否则需要多次单独调用。

答案 2 :(得分:2)

使用MPTT可以使系统运行。当您自己实现它时,您可能最终手动将节点连接在一起(一个~30行函数),或者对所有子级别进行单独查询。那里做了大量的手工工作。

使用MPTT算法,可以在一个查询中获取子树。 这是存储分层数据的常用算法。

Django MPTT(尤其是v0.4)有一些很好的API可以在管理和模板中正确显示所有这些数据。你不必重新发明轮子。