【问题标题】:Google appengine datastore tree structureGoogle appengine 数据存储树结构
【发布时间】:2010-04-09 03:38:58
【问题描述】:

我需要能够在 appengine 数据库中创建树状结构。
我尝试自己创建一个对象引用,但没有让它工作。

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

【问题讨论】:

  • 以及什么样的树有节点引用自己
  • 节点本身并没有在他的代码 sn-p 中引用自己,但是 Node 类需要引用其他 Node 对象来创建树。相反,孩子应该参考其父母(见我的回答)

标签: python database google-app-engine


【解决方案1】:

或者,您可以将对子级的引用存储在父级中:

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

这个答案从 Nick Johnson 对this related question 的回答中被无耻地窃取(值得称赞!)

【讨论】:

    【解决方案2】:

    Here 是来自 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)
    

    parentModel 上的一个特殊字段,它告诉数据存储一个实体与其父实体具有父子关系。

    来自docs

    当应用程序创建一个 实体,它可以分配另一个实体 作为新实体的父级,使用 模型中的父参数 构造函数。将父级分配给 新实体将新实体放入 与父级相同的实体组 实体。

    没有父实体的实体是根实体。作为另一个实体的父级的实体也可以有父级。从实体到根的父实体链是实体的路径,路径的成员是实体的祖先。实体的父实体是在实体创建时定义的,以后不能更改。

    【讨论】:

    • 除非实体需要在同一个事务域(实体组)中,否则不应在数据存储中使用父/子关系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 2010-11-12
    相关资源
    最近更新 更多