2

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

class Blog_Entries(ndb.Model):
    ...

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

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

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

提前致谢

4

2 回答 2

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'
于 2013-10-22T09:29:55.923 回答
1

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

于 2012-11-18T10:03:43.170 回答