Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Appengine模型自引用属性和父子关系_Python_Google App Engine - Fatal编程技术网

Python Appengine模型自引用属性和父子关系

Python Appengine模型自引用属性和父子关系,python,google-app-engine,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()

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

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模型中的这种关系。

我建议使用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)
验证实体自己的密钥是否不在列表中有点困难,可能需要编写一个