Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.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 NDB:如何获取依赖于父结构化属性上存储的值的子实体_Python_App Engine Ndb - Fatal编程技术网

Python NDB:如何获取依赖于父结构化属性上存储的值的子实体

Python NDB:如何获取依赖于父结构化属性上存储的值的子实体,python,app-engine-ndb,Python,App Engine Ndb,我有以下型号: 类角色(ndb.Model): email=ndb.StringProperty(必需=True) type=ndb.StringProperty(选项=['writer'、'editor'、'admin'] 教材(ndb.Model): uid=dnb.StringProperty(必需=True) user=ndb.UserProperty(auto\u current\u user\u add=True) name=ndb.StringProperty(必需=True) 与

我有以下型号:

类角色(ndb.Model):
email=ndb.StringProperty(必需=True)
type=ndb.StringProperty(选项=['writer'、'editor'、'admin']
教材(ndb.Model):
uid=dnb.StringProperty(必需=True)
user=ndb.UserProperty(auto\u current\u user\u add=True)
name=ndb.StringProperty(必需=True)
与=ndb.StructuredProperty共享(角色,重复=True,索引=True)
类页(ndb.Model):
uid=dnb.StringProperty(必需=True)
user=ndb.UserProperty(auto\u current\u user\u add=True)
title=ndb.StringProperty(必需=True)
parent\u uid=ndb.ComputedProperty(lambda self:self.key.parent().get().uid)
shared_with=ndb.ComputedProperty(lambda self:self.key.parent().get().shared_with)
我使用的结构是:

 Book1   Book2  - (parent)
  |        |
  ^        ^
pages    pages  - (child)
创建书籍时,与共享的将充满电子邮件/角色列表

例如:

Book.uid=user.user\u id()
Book.user=用户
Book.name=“学习appengine NDB”
Book.shared_with=[角色(“用户_1@domain.tld“,”管理员“),角色(“用户_2@domain.tld“,”编辑“)]
当用户创建页面时,
user.user\u id()
存储为uid

当用户_2@domain.tld(角色类型:编辑器)创建一个页面:

Page.title=“了解ComputedProperty”
Page.uid=user.user\u id()
Page.user=用户
使用此模式,如果要向用户显示_2@domain.tld只有他创建的页面,我才可以通过uid进行简单的查询,例如:

# supposing user_2@domain.tld is logged in
user2_pages = Page.query(Page.uid = user.user_id())
query = Pages.query(
          Pages.parent_uuid == user.user_id()
        )
# query returns None
但是对于本书的共享属性中列出的其他用户,我如何才能继续显示他们自己的(他们创建的页面),以及所有其他用户,只要他们有
角色(管理员、编辑)

例如,如果我想允许其他用户(管理员、编辑)查看为所有书籍创建的最后一页列表,我如何执行查询来查看

到目前为止,我一直在尝试使用ComputedProperty,但没有成功,我无法让它按预期工作

为了验证我是否获得了正确的值,我执行了如下查询:

query = Pages.query().get()
print query.parent_uid
我确实获得了父uid,和shared.with值相同,但由于未知原因,我无法使用它们进行筛选,例如:

# supposing user_2@domain.tld is logged in
user2_pages = Page.query(Page.uid = user.user_id())
query = Pages.query(
          Pages.parent_uuid == user.user_id()
        )
# query returns None
一种可能更好、更简单的方法是显示每本书的页面,但我想知道是否有可能对所有的书都这样做,这样管理员和编辑就可以看到通常创建的最后页面列表,而不是查看每本书


有什么想法吗?

您的计算属性无法工作,因为它仅在放置页面实体时更新。请参阅。对书本实体的任何更改都不会影响页面计算属性

您可以尝试使用模型挂钩来维护Page.shared_。请参阅

我想知道这是否是最好的方法。如果你有书籍级别的共享信息,你可以使用它的索引来检索书籍键列表。你可以使用仅键查询来实现这一点。然后你可以检索这些父键的所有页面的列表。这样你就不必将带有属性的共享_添加到页面模型中。成本查询的数量将稍大,但页面实体将更小,维护成本更低