python - 如何在没有在谷歌应用引擎中读取数据存储的情况下从实体实例获取引用实体属性的键名?

标签 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")
  1. 每个团队实体的键名 = 'team_',每个玩家实体的键名 = 'player_'

  2. 通过一些事先安排,我有一个团队实体的 (key_name, name) 映射可供我使用。例如(team_01,美国),(team_02,俄罗斯)等

  3. 我必须在一个页面上显示所有球员和他们的球队。这样做的一种方法是 -

    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
    
  4. 读取 1001 DB 是一件愚蠢的事情。

  5. 有趣的是,当我对玩家执行 db.to_dict() 时,它显示该列表中的每个玩家都有玩家的“姓名”和团队的“key_name”也可用。

  6. 那么我该怎么做呢??

    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/

相关文章:

python - 在 Keras 中实现自定义卷积层 - 加载模型时出错

Python/Pygame - 网格上最近的坐标

java - 使用 Java 随机查询 Google App Engine 数据存储区实体

java - 我无法让谷歌云端点正常工作,我是否调用了正确的公共(public)链接?

python - 如何在 python 3.6 中键入 hinte 高阶函数?

python - TensorFlow 1.0.0 的prepare_attention API 相当于tensorflow 1.2.0

python - Pandas 字符串提取所有匹配项

java - Google App Engine Java 低级数据存储区 API

java - 通过使用 rhino 或标准内置 javascript 支持在 java 中嵌入 javascript 来在客户端使用 Google channel api?

java - GAE : Incoming emails can not preserve format