Appengine Model SelfReferenceProperty和父子关系

时间:2010-06-13 05:43:53

标签: python google-app-engine

我有一个场景,我需要一个自引用属性,如下所示:

class Post(db.Model):
  creator = db.UserProperty()
  post_title = db.StringProperty(required=True)
  post_status = db.StringProperty(required=True, choices=['draft', 'published'])
  post_parent = db.SelfReferenceProperty()

现在,我希望确保实体不应该是它自己的父实体,而实体的子实体不能是它的父实体。如何在PostForm模型表单和Post模型中确保这种关系。

1 个答案:

答案 0 :(得分:2)

我建议使用ListProperty(db.Key)代替存储祖先列表。这样,您可以更有效地查询(“让每个节点x的后代更容易”),并且您可以轻松地强制执行后一种情况,如下所示:

def ancestor_list_validator(l):
  if len(l) != len(set(l)):
    raise Exception("Repeated values in ancestor list!")

class Post(db.Model):
  # ...
  ancestors = db.ListProperty(db.Key, validator=ancestor_list_validator)

验证实体自己的密钥不在列表中有点困难,可能需要编写custom datastore property