1

在重複KeyProperty編輯一個實例可以說我有以下型號:的App Engine通過實例本身

class Author(ndb.Model) 
    books = ndb.KeyProperty(kind='Book', repeated=True) 

class Book(ndb.Model) 
    title = ndb.StringProperty() 

所以在某一點你必須用n書籍列表的作者。

問題: 當我編輯一本書時,如何更改作者而不參考「當前」作者?我是否需要在Book上添加與KeyProperty的反向關係?

在更改作者時,我必須從舊作者的列表中刪除該書並將其添加到新的作者。這感覺很麻煩。有沒有更好的辦法?

獎勵問題:如果一本書被刪除會怎麼樣?在作者的書籍列表中將會有一個None值。我必須刪除它嗎?

注意:我使用重複的KeyProperty,因爲這使得訂購書很容易,在我的情況下這很重要。

回答

1

當我編輯一本書時,如何更改作者而不參考「當前」作者?

可以使用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() 

當然,如果插入很頻繁,你可能想使用另一種結構來保存圖書清單

+0

感謝您的回答。也許我的書/作者的例子不是我的用例最好的。如前所述,訂單非常重要。把它想象成一個演示/幻燈片關係。 我更喜歡您的設計建議,但您將如何處理演示文稿中幻燈片的排序?或作者書籍列表中的書籍。 –

+0

使用'order by' https://cloud.google.com/appengine/docs/python/datastore/queryclass?hl=en#Query_order使用'book'示例,您可以按照某些條件對結果進行排序,例如'publication_date ' –

+0

訂單應該是可控的:一本書應該能夠在作者的書目清單中上下移動。這可以通過'sort_value'屬性來實現。但是當你想要移動一本書時(通過改變'sort_value'),你必須更新所有作者書籍的'sort_value',這將需要每本書的查詢嗎? –

0

你的關係真的是錯誤的方式。您應該在Book上有一個指向Author的KeyProperty;那麼如果你想查詢單個作者的所有書籍,你可以在作者鍵上查詢。

+0

感謝您的回答。你能看看安東尼的答案下面的評論嗎?順序非常重要,這就是爲什麼我這樣模擬它。所以我可以利用重複鍵屬性(這是一個列表)中的順序。 –