我在我的一个项目中使用couchdb.mapping。我有一个从SupportCase
派生的名为Document
的类,其中包含我想要的所有字段。
我的数据库(称为admin
)包含多种文档类型。我在所有用于区分它们的文档中都有一个type
字段。我有许多要使用视图获取的"case"
类型的文档。我有一个名为support
的设计文档,其内部有一个名为cases
的视图。如果使用db.view("support/cases)
请求此视图的结果,则会返回具有所需内容的Row
列表。
但是,我想以某种方式将其包装在SupportCase
类中,这样我就可以调用单个函数并获取系统中所有SupportCase
的列表。我创建了一个ViewField
属性
@ViewField.define('cases')
def all(self, doc):
if doc.get("type","") == "case":
yield doc["_id"], doc
现在,如果我呼叫
SupportCase.all(db)
,我将恢复所有情况。我不了解的是此视图是预先计算并存储在数据库中还是按需完成,类似于
db.query
。如果是后者,它将变得很慢,我想使用预先计算的视图。我怎么做? 最佳答案
我认为您需要的是:
@classmethod
def all(cls):
result = cls.view(db, "support/all", include_docs=True)
return result.rows
Document
类具有一个类方法view
,该方法按被调用的类包装行。因此,以下代码为您返回一个ViewResult
,其行类型为SupportCase
,并以其中的.rows
列出支持案例。SupportCase.view(db, viewname, include_docs=True)
而且我认为您无需深究ViewField的魔力。但是,让我解释一下它是如何工作的。请考虑
CouchDB-python
文档中的以下示例。class Person(Document):
@ViewField.define('people')
def by_name(doc):
yield doc['name'], doc
我认为这相当于:
class Person(Document):
@classmethod
def by_name(cls, db, **kw):
return cls.view(db, **kw)
原始功能附加到
People.by_name.map_fun
。关于python - Couchdb-Pythons ViewField中map函数的含义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5883068/