Google App Engine 数据存储树形结构

2 投票
2 回答
2126 浏览
提问于 2025-04-15 21:24

我需要在appengine数据库中创建一个类似树的结构。
我尝试让一个对象引用自己,但一直没有成功。

class Item(db.Model):
    children = db.ListProperty(db.ReferenceProperty(Item))

2 个回答

1

这里有一个和google-appengine小组相关的话题。

你可以在每个子节点中存储对父节点的引用,而不是在父节点中存储对子节点的引用。

下面是一些代码:

class Node(db.Model):
    pass

...snip...

root = Node()
db.put(root)

for i in xrange(10):
    child = Node(parent=root)
    db.put(child)
    
    for i in xrange(5):
        grandchild = Node(parent=child)
        db.put(grandchild)

parent是一个特殊的字段,用于Model,它告诉数据存储系统这个实体和它的父实体之间有父子关系。

根据文档

当应用程序创建一个实体时,可以通过在模型构造函数中使用parent参数,将另一个实体指定为新实体的父实体。给新实体指定一个父实体,会把这个新实体放在和父实体相同的实体组里。

没有父实体的实体叫做根实体。作为另一个实体的父实体也可以有自己的父实体。从一个实体到根实体的父实体链就是这个实体的路径,路径上的成员就是这个实体的祖先。实体的父亲在创建时就定义好了,之后不能再改变。

3

另外,你可以在父节点中存储对孩子节点的引用,方法是:

class Node(db.Model):
    children = db.ListProperty(db.Key)

这个答案是从Nick Johnson对这个相关问题的回答中借来的(当然有注明来源!)

撰写回答