我正在爲GAE編寫一個應用程序,該應用程序爲不同的用戶存儲食譜。我在數據存儲中有一個名爲User的實體和一個名爲Recipe的實體。我希望能夠將每個食譜的所有者設置給創建它的用戶。此外,我希望每個用戶實體都包含屬於該用戶的所有食譜的列表,以及能夠查詢食譜數據庫以查找特定用戶擁有的所有食譜。Google App Engine實體所有權
要創建此父/子類型關係的最佳途徑是什麼?
謝謝
我正在爲GAE編寫一個應用程序,該應用程序爲不同的用戶存儲食譜。我在數據存儲中有一個名爲User的實體和一個名爲Recipe的實體。我希望能夠將每個食譜的所有者設置給創建它的用戶。此外,我希望每個用戶實體都包含屬於該用戶的所有食譜的列表,以及能夠查詢食譜數據庫以查找特定用戶擁有的所有食譜。Google App Engine實體所有權
要創建此父/子類型關係的最佳途徑是什麼?
謝謝
有兩種主要方式。 (我會假設你使用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。
如果使用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
或者,你可以使用NDB的KeyProperty
在Tim的答案。
另請參閱 db.ReferenceProperty() vs ndb.KeyProperty in App Engine