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

3

我有这个模型:

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.al_tree和Django MPTT,两者都很强大,但可能会导致性能下降或难以维护。
我将在网站的侧边栏和管理页面中显示类别(包括帖子模型中的ForeignKey),类别的添加/修改/删除非常少,主要是只读操作,这不应该对性能产生影响。
是否有其他应用程序可以提供此功能并比上述应用程序更简单? 我能否使用Django而不需要额外的应用程序,使用管理器或其他方法来实现此功能?

1
即使您不使用MPTT,通过查看其代码,您也可以对其工作原理有一些了解。 - Ankit Jaiswal
3个回答

4

我认为使用像django-mptt这样的应用程序没有任何缺点。实际上,它提供的方法经过优化,可以在处理具有层次结构的查询时提供最大的性能。我不需要担心可维护性和/或性能问题,而且它非常容易使用!


谢谢,我会使用django-mptt。 - Someone

4
MPTT或treebeard可能会导致性能降低?纯属胡说。这些应用程序的整个重点是提供高度优化的算法,大幅度提高性能。MPTT允许您使用单个数据库操作抓取整个树或其子部分,否则需要许多单独的调用。请注意不要改变HTML标签格式。

我的观点是,一个有许多选项的大型应用程序可能比一个具有特定需求的简单应用程序慢。我现在将使用django-mptt。谢谢。 - Someone

2
使用MPTT是为了使系统更高效。当您自己实现时,可能需要手动连接节点(一个大约30行的函数),或者对所有子级进行单独查询。这需要大量的手动工作,我们已经尝试过。
使用MPTT算法,可以通过一次查询获取子树。这是一种常见的存储分层数据的算法。
Django MPTT(特别是v0.4)具有一些不错的API,可以在管理界面和模板中正确显示所有这些数据。您无需重新发明轮子。

谢谢,我会使用django-mptt。 - Someone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接