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'