我有以下模型,其中不同的文本被标记到不同的文本集合,每个文本可以有多个版本,但只有一个“活动”版本:
class Collection(db.Model):
name = db.StringProperty()
...
class Text(db.Model):
title = db.StringProperty(default="Untitled")
...
class Version(db.Model):
text = db.ReferenceProperty(Text, collection_name="versions")
content = db.TextProperty()
active = db.BooleanProperty(default=True)
...
class Tag(db.Model):
collection = db.ReferenceProperty(Collection, collection_name="c_tags")
text = db.ReferenceProperty(Text, collection_name="t_tags")
现在我想在一个集合中显示所有“活动”文本:
class ViewCollection(webapp.RequestHandler):
def(get):
collection = Collection.get(self.request.get("key"))
# grabs the collection to display
tags = collection.t_tags
# grabs all the tags linking a text and a collection
texts = [t.text for t in tags]
这将为我提供所有文本的列表,因此我可以轻松打印所有文本标题(t.title for t in texts
),但有没有任何聪明的方法我现在可以抓住每个文本的相应“活动”版本文本?
或者这种不同模型类的过滤是不可能的?
答案 0 :(得分:1)
App Engine的数据存储区不是针对这种关系代数问题而设计的。我不相信你现在的设计可以有效地完成。我建议您阅读NoSQL数据库概念,并将您的模型重新设计为“不那么关系”。
答案 1 :(得分:1)
您必须在Version对象上发出另一个查询,其中text == t.text和active == True。
根据您的使用情况,在标签中进行非规范化并存储最新版本可能是值得的,因此您无需额外的查询来获取数据。这种非规范化是nosql数据存储的常见“优化”。