假设我正在建立一个网页,其网页将由PageModel表示,如下所示:
class PageModel(db.Model):
name = db.StringProperty()
parentPage = db.SelfReferenceProperty()
content = db.TextProperty()
我希望能够提取所有页面对象的列表,以便呈现菜单等,但无需为所有项目提取内容。您将如何为此对象建模,以便只在需要时才能提取内容?是否需要与单独的“内容”模型建立一对一的参考关系?如果是这样,您会在page
对象或content
对象上进行引用吗?
答案 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的建议。