Google App Engine 数据存储树形结构
我需要在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对这个相关问题的回答中借来的(当然有注明来源!)