Django 树形建模

4
我是一个完全迷失的新手,试图找出如何使我的硬编码链接列表动态生成,这不仅是为了学习Django而进行的新手练习,也是为了通过管理员编辑数据。重要的是,在通过数据库生成时,它看起来与现在硬编码状态下的样子完全一样。
这里的主要内容需要由模型表示:

http://www.drugpolicyreformmovement.com/directory

我认为首先需要创建一个“类别”表格来存放类别标题,然后再创建一个“链接”表格,其中每个链接都与“类别”表格中的一个外键关联。在模板中,我会使用“ifchanged”模板标签和(嵌套?)循环来依次迭代每个标题,并显示每个标题的子记录。
这变得复杂的是,在“研究和教育”标题下,子记录有其自己的子记录。可能会需要适应任意数量的子级,特别是当我将此代码用于其他项目时。
我已经花了两天时间查看文档和答案,但仍没有清晰的模型、视图或模板设计方案。
例如,在模板中如何向下遍历子级以查看元素是否有子元素?如何在不每次访问数据库一千次的情况下完成所有这些操作?
2个回答

6
你需要做的是:使用 django-mptt
这基本上是在数据库中存储节点树并以最小的数据库访问高效地检索它的标准解决方案。它包括一些有用的模板标签,应该帮助你按照你想要的方式输出内容。

2
我强烈不建议使用django-mptt,原因如下:
  1. 仅仅使用原始插入操作就能很容易地破坏您的数据。
  2. 在一个项目上进行插入、移动或删除操作将导致整个树的更新。在大量数据的情况下可能会非常缓慢。
最好使用本机的Postgres字段ltree。 然而,有一些缺点:它只适用于Postgres,没有Django本地库来维护,您必须自己创建Postgres扩展。否则,您将收到错误消息type "ltree" does not exist。有一个简单的解决方法:CREATE EXTENSION ltree; 这个 django-tree 存储库似乎可以工作,但官方并不支持Django 2.0

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