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)
它看起来不容易理解吗?
在使用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更容易和可读。
提前致谢..
答案 0 :(得分:26)
答案 1 :(得分:7)
我不知道为什么Guido没有实现引用属性的答案。
然而,我发现花了很多时间使用pre_fetch_refprops http://blog.notdot.net/2010/01/ReferenceProperty-prefetching-in-App-Engine(通过使用get_value_for_datastore抓取所有键来预取所有引用属性),然后它在键上执行get_multi。
这样效率更高。
此外,如果引用的对象不存在,则在尝试获取对象时会出现错误。
如果你腌制了一个带有参考物的物体,你最终会腌制比你想象的要多得多。
所以我发现除了一个案例,你有单个实体,你想用.name类型访问器获取引用的对象,你必须跳过各种箍,以防止被引用的实体被提取。