referenceproperty在处理两个模块之间的引用时非常有用。Fox示例:

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)
会给你经理的名字
要让所有由特定用户管理的团队都参与进来,我们必须这样做
for team in Team.query(Team.manager_name == user_ins.key):
    print "team  name:", team.name

正如您所看到的,在DB中处理此类场景比在NDB中更容易和可读。
在NDB中删除referenceproperty的原因是什么?
即使是DB的查询用户_Instance.teams也会像在NDB的for循环中那样做。但是在ndb中,我们明确提到了使用for循环。
当我们进行用户实例团队时,幕后发生了什么?
提前谢谢……

最佳答案

蒂姆解释得很好。我们发现一个常见的反模式是使用引用属性并一次加载一个,因为符号“entity.property1.property2”并不能清楚地表明第一个点导致数据库“get”操作。因此,我们通过强制您编写“entity.property1.get().property2”使其更加明显,并且我们通过简单地对一组实体说“entity.property1.get_Async()”,使批预取(没有来自nick博客的复杂解决方案)变得更容易——这将单个批获取操作与不阻塞结果,下次使用“entity.property1.get().property2”引用这些属性时,这不会启动另一个get操作,而是等待该批处理完成(第二次执行此操作时,批处理get已完成)。同样,这种进程内和memcache集成也是免费的。

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

10-14 13:31