ndb.StructuredProperty不保存密钥?

时间:2012-11-18 08:53:43

标签: google-app-engine python-2.7 google-cloud-datastore app-engine-ndb

如果我们有通常的博客文章webapp,许多用户可以发布博客条目,但我们也想从单个用户检索所有条目,我会想象以下数据结构:

class Blog_Entries(ndb.Model):
    ...

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

但是,问题是当您将“Blog_Entries”对象复制到Users.blog_entries时,密钥将丢失(不会从原始实例复制)。这使得更新帖子和保持一致性很麻烦。

有没有办法避免这种情况?有没有更好的策略来解决这个问题?

提前致谢

2 个答案:

答案 0 :(得分: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'

答案 1 :(得分:0)

尝试blog_entries = ndb.KeyProperty(kind =" Blog_Entries",重复= True)