Python 如何从实体实例中获取被引用实体属性的键名,而无需在google app engine中读取数据存储?
假设我有以下模型-Python 如何从实体实例中获取被引用实体属性的键名,而无需在google app engine中读取数据存储?,python,google-app-engine,Python,Google App Engine,假设我有以下模型- class Team(db.Model): # say I have just 5 teams name = db.StringProperty() class Player(db.Model): # say I have thousands of players name = db.StringProperty() team = db.ReferenceProperty(Team, collection_name="player_set") 每个团队实体的键
class Team(db.Model): # say I have just 5 teams
name = db.StringProperty()
class Player(db.Model): # say I have thousands of players
name = db.StringProperty()
team = db.ReferenceProperty(Team, collection_name="player_set")
players = Player.all().fetch(1000) # This is 1 DB read
for player in players: # This will iterate 1000 times
self.response.out.write(player.name) # This is obviously not a DB read
self.response.out.write(player.team.name) #This is a total of 1x1000 = 1000 DB reads
players = Player.all().fetch(1000) # This is 1 DB read
for player in players: # This will iterate 1000 times
self.response.out.write(player.name) # This is obviously not a DB read
self.response.out.write(team_list[player.<SOME WAY OF GETTING TEAM KEY NAME>]) # Here 'team_list' already has (key_name, name) for all 5 teams
players=Player.all().fetch(1000)#这是1db读取
对于玩家中的玩家:#这将迭代1000次
self.response.out.write(player.name)#这显然不是数据库读取
self.response.out.write(团队列表[玩家])#这里的“团队列表”已经为所有5个团队提供了(键名称、名称)
免责声明:上述问题描述并非真实情况。这是一个简单的安排,正好代表了我的问题。我在一个rater complex和big GAE应用程序中遇到了它。a存储了一个。您应该能够使用密钥的方法来获取密钥名称。A存储密钥名称。您应该能够使用密钥的方法来获取密钥名称。从您给定的情况开始,降低数据库成本的唯一方法是缓存
团队
。如果您使用新的NDB API,这已经在幕后为您完成了。从您的特定情况开始,降低数据库成本的唯一方法是缓存团队。如果您使用新的NDB API,这已经在幕后为您完成了。如果您有一个团队,许多玩家都通过键引用该团队,并且您希望在显示该团队时列出一些玩家属性子集,并且希望最小化数据库读取,那么您可能需要取消规范化,并将玩家信息的一些子集缓存在连接到团队的序列化blob(或Json块)中。在成员更改时懒洋洋地重新计算blob(如果成员更改的频率低于团队视图,这是一个肯定的胜利)。这种更新是后台任务的最佳使用案例。如果您有一个团队,许多玩家通过键引用该团队,并且您希望在显示该团队时列出一些玩家属性子集,并且希望最小化数据库读取,那么您可能需要反规范化,并将玩家信息的一些子集缓存在连接到团队的序列化blob(或Json块)中。在成员更改时懒洋洋地重新计算blob(如果成员更改的频率低于团队视图,这是一个肯定的胜利)。这种更新是后台任务的完美用例。在循环中,Player.team.get\u value\u for\u datastore(Player)
将返回团队的关键对象,而不从数据存储中获取任何内容
如果你想为一组玩家预先获取所有团队(假设你有5个以上的团队,所以如果你不需要所有的团队,就不想获取所有的团队),那么说明一个很好的技巧。在你的循环中,Player.team.get\u value\u for\u数据存储(玩家)
将返回团队的密钥对象,而不从数据存储中获取任何内容
如果你想为一组球员预先获取所有球队(假设你有超过5支球队,所以如果你不需要他们,就不想获取所有球队),那么说明一个好的技巧。你已经提到了。to_dict()
给你一个球队的键名
;为什么不将其用于“获取团队名称的某种方式”?Player.all().fetch(1000)
将花费与它将花费的实体数相同的DB查询操作数return@Amber+1考虑到我在这方面花费的时间,我应该使用dict。但我认为必须有另一种方法可以直接从players
实体列表中获取。@PeterKnego我特别提到了一个DB读取(或者更确切地说是数据存储读取),而不是像Google将Player.all().fetch(1000)
计算为1 DB读取那样计算查询操作的数量。您可以使用此项检查应用程序统计信息-无需在密钥名称中包含“团队”或“玩家”-密钥名称仅在实体类型中是唯一的。您已经提到,。to_dict()
为您提供了团队的密钥名称
;为什么不将其用于“获取团队名称的某种方式”?Player.all().fetch(1000)
将花费与它将花费的实体数相同的DB查询操作数return@Amber+1考虑到我在这方面花费的时间,我应该使用dict。但我认为必须有另一种方法可以直接从players
实体列表中获取。@PeterKnego我特别提到了一个DB读取(或者更确切地说是数据存储读取),而不是像Google将Player.all().fetch(1000)
计算为1 DB读取那样计算查询操作的数量。您可以使用此项检查应用程序统计信息-无需在密钥名称中包含“team_uuu”或“player_uuuu”-密钥名称仅在实体类型中是唯一的。嗯。我试着阅读有关NDB API的内容。但是文档中的所有措辞与通常的数据存储部分一样。如此之多,以至于它似乎被复制并放在那里。我很快会再看一遍的。现在,我只是按照@Amber.Hmm的建议使用dict。我试着阅读有关NDB API的内容。但是文档中的所有措辞与通常的数据存储部分一样。如此之多,以至于它似乎被复制并放在那里。我很快会再看一遍的。现在,,