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")
  • 每个团队实体的键名='Team_uu2;',每个玩家实体的键名='Player_2;'

  • 通过某种事先安排,我可以使用团队实体的(key_name,name)映射。例如(美利坚合众国第01队),(俄罗斯第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.to_dict()时,它显示列表中的每个玩家都有玩家的“姓名”,还有可用团队的“关键姓名”

  • 那么我如何才能做到以下几点

    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的内容。但是文档中的所有措辞与通常的数据存储部分一样。如此之多,以至于它似乎被复制并放在那里。我很快会再看一遍的。现在,,