gpt4 book ai didi

python - App Engine 中的 db.ReferenceProperty() 与 ndb.KeyProperty

转载 作者:太空狗 更新时间:2023-10-29 17:01:43 26 4
gpt4 key购买 nike

ReferenceProperty 在处理两个模块之间的引用方面非常有帮助。狐狸例子:

class UserProf(db.Model):
name = db.StringProperty(required=True)

class Team(db.Model):
manager_name = db.ReferenceProperty(UserProf, collection_name='teams')
name = db.StringProperty(required=True)
  • 要使用团队实例获取“manager_name”,我们使用 team_ins.manager_name。
  • 为了获得由特定用户实例管理的“团队”,我们使用 user_instance.teams 并进行迭代。

是不是看起来简单易懂?

在使用 NDB 做同样的事情时,我们必须修改

db.ReferenceProperty(UserProf, collection_name='teams') --> ndb.KeyProperty(kind=UserProf)

  • team_ins.manager_name.get() 会给你经理的名字
  • 要获得由特定用户管理的所有团队,我们必须做

    for team in Team.query(Team.manager_name == user_ins.key): 
    print "team name:", team.name

如您所见,在 db 中处理此类场景看起来比在 ndb 中更容易和可读。

  • 删除 ndb 中的 ReferenceProperty 的原因是什么?
  • 即使是 db 的查询 user_instance.teams 也会做与在 ndb 的 for 循环中所做的相同的事情。但是在 ndb 中,我们明确提到使用 for 循环。
  • 当我们执行 user_instance.teams 时,幕后发生了什么?

提前致谢..

最佳答案

蒂姆解释得很好。我们发现一个常见的反模式是使用引用属性并一次加载它们,因为符号“entity.property1.property2”没有明确表示第一个点导致数据库“获取”操作。因此,我们通过强制您编写“entity.property1.get().property2”使其变得更加明显,并且我们通过简单地说“entity.property1.get_async”使批处理预取变得更容易(没有来自 Nick 博客的复杂解决方案) ()”对于一堆实体——这会在不阻塞结果的情况下对单个批处理获取操作进行排队,并且当您下次使用“entity.property1.get().property2”引用这些属性时,这不会启动另一个get 操作,但只是等待批处理完成(第二次执行此操作时,批处理已经完成)。此外,这种方式的进程内和内存缓存集成是免费的。

关于python - App Engine 中的 db.ReferenceProperty() 与 ndb.KeyProperty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16807108/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com