过滤模型类

时间:2012-08-23 02:43:59

标签: python google-app-engine

我有以下模型,其中不同的文本被标记到不同的文本集合,每个文本可以有多个版本,但只有一个“活动”版本:

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),但有没有任何聪明的方法我现在可以抓住每个文本的相应“活动”版本文本?

或者这种不同模型类的过滤是不可能的?

2 个答案:

答案 0 :(得分:1)

App Engine的数据存储区不是针对这种关系代数问题而设计的。我不相信你现在的设计可以有效地完成。我建议您阅读NoSQL数据库概念,并将您的模型重新设计为“不那么关系”。

答案 1 :(得分:1)

您必须在Version对象上发出另一个查询,其中text == t.text和active == True。

根据您的使用情况,在标签中进行非规范化并存储最新版本可能是值得的,因此您无需额外的查询来获取数据。这种非规范化是nosql数据存储的常见“优化”。