gpt4 book ai didi

jquery - Django 将层次结构建模为邻接列表或嵌套集 - 最佳方式(带过滤)

转载 作者:行者123 更新时间:2023-12-01 08:11:23 25 4
gpt4 key购买 nike

我的 Django 应用程序在数据库中存储一些分层数据,如下所示:

 class Foo(Model):
# ... fields
parent = ForeignKey('self', null = True)

现在,为了在 jqGrid Tree 中显示该树数据,我需要将该数据转换为邻接列表或嵌套集,因为 jqGrid 支持这两种方法。

我编写了构建邻接列表的简单函数,如下(伪代码)

list=[]
def build_list(parent = None, level = 0)
data = Foo.objects.select_related().filter(parent=parent).annotate(sub_count = Count('foo'))
for x in objects:
obj = {
'name': x.name,
'id': x.pk,
'level': level,
'isLeaf': x.sub_count == 0
}
list.append(obj)
if x.sub_count > 0:
build_list(x.pk, level + 1)

但是,随着记录数量的增加,我担心这种递归。

有更好的方法吗?

PS。我 无法更改模型的架构(定义),因为应用程序的其他部分(和其他服务)依赖于当前的结构。

PS。 2.背后的数据库是Postgres,但如果可能的话,我希望解决方案保持与数据库无关

最佳答案

有一种在 SQL 数据库中存储分层数据的算法。这称为修改的先序树遍历。您可以阅读Storing Hierarchical Data in a Database文章了解详细信息。它将允许您在一次查询中选择子树的所有项目。

对于 Django,有一个实现它的应用程序 - django-mptt

实际上,您需要修改数据库,但这将包括添加两个数字列,因此您可以保持 parent 和所有其他字段不变

关于jquery - Django 将层次结构建模为邻接列表或嵌套集 - 最佳方式(带过滤),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13406818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com