Google App Engine实体所有权

时间:2013-08-04 20:05:15

标签: google-app-engine

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

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

由于

2 个答案:

答案 0 :(得分:2)

主要有两种方式。 (我将假设您使用python定义示例)

选项1.让用户成为他们所有食谱的祖先

recipe = Recipe(parent=user.key)

选项2.使用关键属性

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

答案 1 :(得分:1)

如果使用db.Model来建模一对多关系,则可以使用RefernenceProperty构造函数并指定collection_name。例如,一本书可能有很多评论。


    class Book(db.Model):
    title = db.StringProperty()
    author = db.StringProperty()

    class BookReview(db.Model):
        book = db.ReferenceProperty(Book, collection_name='reviews')

    b = Book() 
    b.put()
    br = BookReview()  
    br.book = b # sets br's 'book' property to b's key 

    for review in b.reviews:# use collection_name to retrieve all reviews for a book
        ....

请参阅https://developers.google.com/appengine/docs/python/datastore/datamodeling#references

或者,你可以在Tim的回答中使用ndb的KeyProperty

另见 db.ReferenceProperty() vs ndb.KeyProperty in App Engine