在Google App Engine中延迟加载大型/复杂模型属性

时间:2011-11-18 20:56:30

标签: google-app-engine

假设我正在建立一个网页,其网页将由PageModel表示,如下所示:

class PageModel(db.Model):
    name = db.StringProperty()
    parentPage = db.SelfReferenceProperty()
    content = db.TextProperty()

我希望能够提取所有页面对象的列表,以便呈现菜单等,但无需为所有项目提取内容。您将如何为此对象建模,以便只在需要时才能提取内容?是否需要与单独的“内容”模型建立一对一的参考关系?如果是这样,您会在page对象或content对象上进行引用吗?

1 个答案:

答案 0 :(得分:2)

您可以将content属性移动到新模型(PageContentModel)。我将通过让PageContentModel的父级为PageModel(使用db.Model的父属性)来实现引用。这允许您在单个事务中修改它们(因为它们在单个实体组中)。

使用PageContentModel对页面模型进行建模(与PageModel相对于PageContentModel相对)的一个好处是,如果您需要的内容大于1MB,则可以通过允许每个PageModel来实现拥有一个或多个PageContentModel对象,您只需将内容拆分为1MB块,并将每个块写入不同的PageContentModel实例。为了能够获取内容,您需要PageContentModel对象具有与它们关联的“order”属性,以便您可以按正确的顺序重新构建内容。

要查询与PageModel相关的PageContentModel实例,您可以像这样使用祖先过滤器:

PageContentModel.all().ancestor(page_model_instance)

正如@Nick所建议的那样,另一种方法是使用files api将内容写入blobstore中的blob,然后通过在PageModel上使用BlobReferenceProperty将该blob链接到PageModel。我现在有机会尝试这个并且它工作得很好(尽管它是一个实验性功能)。这将允许您的内容非常大,并且在新的定价模式下,实际上比将内容存储在数据存储模型中更便宜。

2012年2月7日更新以包含@Nick关于blobstore的建议。