-1

我正在用 Python 为 GAE 编写一个应用程序,它为不同用户存储食谱。我在数据存储中有一个名为 User 的实体和一个名为 Recipe 的实体。我希望能够将每个配方的所有者设置为创建它的用户。此外,我希望每个用户实体都包含属于该用户的所有食谱的列表,并且能够查询食谱数据库以查找特定用户拥有的所有食谱。

创建这种父/子类型关系的最佳方法是什么?

谢谢

4

2 回答 2

2

主要有两种方式。(我将假设您使用定义示例的 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

于 2013-08-05T02:41:24.067 回答
1

如果您使用 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 的回答中一样。

另请参阅 App Engine 中的 db.ReferenceProperty() 与 ndb.KeyProperty

于 2013-08-06T03:00:12.147 回答