當我編輯一本書時,如何更改作者而不參考「當前」作者?
可以使用ndb.Model.allocate_ids
保留的關鍵實體保存
之前,我是否需要添加反向關係,與預約KeyProperty?
鑑於你的模型,增加了一個反向查找鍵可以使您的生活更輕鬆
如果一本書是什麼被刪除?在作者的書籍列表中將有一個None值。我必須刪除它嗎?
Auther.books
中的鍵在這種情況下不會自動變爲空。你必須自己刪除它。
我使用重複的KeyProperty,因爲這使得訂購書很容易,在我的情況下這很重要。
潛在的問題是一個實體的大小限制爲1mb。如果作者是非常多產的作家(例如Edwy Searles Brooks有800多個出版作品),它可能會超出限制。
我將設計模型是這樣的:
class Author(ndb.Model):
name = ndb.StringProperty()
class Book(ndb.Model):
authors = ndb.KeyProperty('Author', required=True) # Usually it is at most a couple of authors
title = ndb.StringProperty()
要找出ID爲1234的書面特定作者的所有書籍,你可以
Book.query(Book.authors == ndb.Key('Author', 1234)).fetch()
顯然書籍的順序必須存儲明確地說,我會建議第三方實體跟蹤這些信息:
class BookList(ndb.Model):
name = ndb.StringProperty()
book_keys = ndb.KeyProperty(kind='Book', repeated=True)
然後,你可以用這種方式
stephen_king_book_list = stephen_king_book_list_key.get()
books = ndb.get_multi(stephen_king_book_list.book_keys)
# Some of key can lead to None if the underlying book is already deleted
# You can define some background job to sweep clean the list from time to time
# But let filter out the bad guys first
books = [b for b in books if b]
檢索書籍。如果你認爲你的名單都將是非常非常長,你可以打破一個列表分解成像一個鏈表結構分段
class BookList(ndb.Model):
prev_segment = ndb.KeyProperty(kind='BookList', required=False)
next_segment = ndb.KeyProperty(kind='BookList', required=False)
name = ndb.StringProperty()
book_keys = ndb.KeyProperty(kind='Book', repeated=True)
你可以通過輕鬆找到拳頭段:
starting_point = BookList.query(BookList.name == 'Stephen_King',
BookList.prev_segment == None
).fetch()
當然,如果插入很頻繁,你可能想使用另一種結構來保存圖書清單
感謝您的回答。也許我的書/作者的例子不是我的用例最好的。如前所述,訂單非常重要。把它想象成一個演示/幻燈片關係。 我更喜歡您的設計建議,但您將如何處理演示文稿中幻燈片的排序?或作者書籍列表中的書籍。 –
使用'order by' https://cloud.google.com/appengine/docs/python/datastore/queryclass?hl=en#Query_order使用'book'示例,您可以按照某些條件對結果進行排序,例如'publication_date ' –
訂單應該是可控的:一本書應該能夠在作者的書目清單中上下移動。這可以通過'sort_value'屬性來實現。但是當你想要移動一本書時(通過改變'sort_value'),你必須更新所有作者書籍的'sort_value',這將需要每本書的查詢嗎? –