2

如果我們有一般的博客帖子的web應用,許多用戶可以發表博客文章,但我們也想要從單個用戶的所有條目,我會想象下面的數據結構:ndb.StructuredProperty不保存密鑰?

class Blog_Entries(ndb.Model): 
    ... 

class Users(ndb.Model): 
    ... 
    blog_entries = ndb.StructuredProperty(Blog_Entries, repeated=True) 
    ... 

然而,問題是當您將「Blog_Entries」對象複製到Users.blog_entries中時,密鑰丟失(不是從原始實例複製)。這使得更新這兩個帖子和保持一致性變得很麻煩。

有什麼辦法可以避免這種情況?有沒有更好的策略來解決這個問題?

在此先感謝

+0

通過使用'StructuredProperty',屬性實例沒有鍵值,它們成爲包含它們的實際實體的一部分。將「Blog_Entries」對象複製到Users.blog_entries中意味着什麼?你是否將博客條目從一個「User」移動到另一個? (我會用模型中的單數名稱而不是像你在這裏使用的複數形式,每個類別都描述單個實體的結構) – aschmid00

回答

0

嘗試blog_entries = ndb.KeyProperty(KIND = 「Blog_Entries」,重複= TRUE)

3

你可以繼承 StructuredProperty並重寫它的 _serialize()_deserialize()方法也序列化/反序列化鍵。您可以使用 KeyProperty來處理密鑰的序列化。 ;-)

我剛剛發現LocalStructuredProperty有一個選項keep_keys。正如選項的名稱所暗示的那樣,它存儲了嵌套模型的關鍵字。

class Organization(ndb.Model): 
    name = ndb.StringProperty() 

class Employee(ndb.Model): 
    name = ndb.StringProperty() 
    organization = ndb.LocalStructuredProperty(Organization, 
               keep_keys=True) 

linux_foundation = Organization(name='Linux Foundation') 
linux_foundation.put() 
linus = Employee(name='Linus Torvalds', organization=linux_foundation) 
linus_key = linus.put() 

ndb.get_context().clear_cache() 
linus = linus_key.get() 
assert linus.organization.key.get().name == 'Linux Foundation'