我正在用 Python 为 GAE 编写一个应用程序,它为不同用户存储食谱。我在数据存储中有一个名为 User 的实体和一个名为 Recipe 的实体。我希望能够将每个配方的所有者设置为创建它的用户。此外,我希望每个用户实体都包含属于该用户的所有食谱的列表,并且能够查询食谱数据库以查找特定用户拥有的所有食谱。
创建这种父/子类型关系的最佳方法是什么?
谢谢
我正在用 Python 为 GAE 编写一个应用程序,它为不同用户存储食谱。我在数据存储中有一个名为 User 的实体和一个名为 Recipe 的实体。我希望能够将每个配方的所有者设置为创建它的用户。此外,我希望每个用户实体都包含属于该用户的所有食谱的列表,并且能够查询食谱数据库以查找特定用户拥有的所有食谱。
创建这种父/子类型关系的最佳方法是什么?
谢谢
主要有两种方式。(我将假设您使用定义示例的 python)
选项 1. 让用户成为他们所有食谱的祖先
recipe = Recipe(parent=user.key)
选项 2. 使用 key 属性
class Recipe(ndb.Model):
owner = ndb.KeyProperty()
recipe = Recipe(owner=user.key)
带有选项 1 的用户的所有食谱
recipes = Recipe.query(ancestor=user.key)
使用选项 2 的用户的所有治疗方法
recipes = Recipe.query().filter(Recipe.owner == user.key)
您使用哪一个在很大程度上取决于您计划在创建后如何处理数据、事务模式等......您应该详细说明您的用例。两者都会起作用。
此外,您应该阅读交易实体组并了解它们以真正确定是否要使用祖先https://developers.google.com/appengine/docs/java/datastore/transactions?hl=en。
如果您使用 db.Model 来建模一对多关系,您可以使用RefernenceProperty
构造函数并指定一个collection_name
. 例如,一本书可能有很多评论。
类书(db.Model): 标题 = db.StringProperty() 作者 = db.StringProperty() 类书评(db.Model): book = db.ReferenceProperty(Book, collection_name='reviews') b = 书() b.put() br =书评() br.book = b # 设置 br 的 'book' 属性为 b 的键 for review in b.reviews:# 使用 collection_name 检索一本书的所有评论 ……
请参阅https://developers.google.com/appengine/docs/python/datastore/datamodeling#references
或者,您可以使用 ndb KeyProperty
,就像 Tim 的回答中一样。