考虑我有以下模型 -
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")
每个团队实体的键名 = 'team_',每个玩家实体的键名 = 'player_'
通过一些事先安排,我有一个团队实体的 (key_name, name) 映射可供我使用。例如(team_01,美国),(team_02,俄罗斯)等
我必须在一个页面上显示所有球员和他们的球队。这样做的一种方法是 -
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
读取 1001 DB 是一件愚蠢的事情。
有趣的是,当我对玩家执行 db.to_dict() 时,它显示该列表中的每个玩家都有玩家的“姓名”和团队的“key_name”也可用。
那么我该怎么做呢??
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
这个问题困扰我好久了。已阅读所有可用的文档。
我可以在这里拥抱可以帮助我的人:-)
免责声明:以上问题描述并非真实场景。这是一个简化的安排,完全代表了我的问题。我在一个复杂的大型 GAE 应用程序中遇到过它。
最佳答案
在您的循环中,Player.team.get_value_for_datastore(player)
将返回团队的 Key 对象,而不从数据存储中获取任何内容。
如果你想为一组球员预取所有球队(假设你有超过 5 个,所以如果你不需要他们就不想全部获取),那么 this blog post解释了一个很好的技术。
关于python - 如何在没有在谷歌应用引擎中读取数据存储的情况下从实体实例获取引用实体属性的键名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9980652/