PYMongo:解析|序列化集合查询输出

0 投票
2 回答
896 浏览
提问于 2025-04-17 04:37

默认情况下,collection.findcollection.findone() 这两个函数的结果是字典类型。如果你传入参数 as_class=SomeUserClass,那么它会尝试把结果转换成这个类的格式。不过,这个类似乎也必须是字典的子类,因为它需要定义 __setitem__ 这个函数,这样我才能在这个类里面添加键值对。 我想要设置这个类的属性,我该怎么做呢? 另外,我的集合类里面还有一些子类作为属性,那我又该如何设置这些子类的属性呢?

2 个回答

0

听起来你想要的是一种对象关系映射工具。其实我就是其中一个工具的主要作者,叫做Ming,不过Python还有其他几种类似的工具。在Ming中,你可以这样来设置你的映射:

from ming import schema, Field
from ming.orm import (mapper, Mapper, RelationProperty, 
    ForeignIdProperty)

WikiDoc = collection(‘wiki_page', session,
    Field('_id', schema.ObjectId()),
    Field('title', str, index=True),
    Field('text', str))
CommentDoc = collection(‘comment', session,
    Field('_id', schema.ObjectId()),
    Field('page_id', schema.ObjectId(), index=True),
    Field('text', str))

class WikiPage(object): pass
class Comment(object): pass

ormsession.mapper(WikiPage, WikiDoc, properties=dict(
    comments=RelationProperty('WikiComment')))
ormsession.mapper(Comment, CommentDoc, properties=dict(
    page_id=ForeignIdProperty('WikiPage'),
    page=RelationProperty('WikiPage')))

Mapper.compile_all()

然后你就可以通过以下方式查询某个特定的页面:

pg = WikiPage.query.get(title='MyPage')
pg.comments # loads comments via a second query from MongoDB

我知道的在Python中用于MongoDB的各种对象文档映射工具如下:

0

我通过在类里面添加 __setitem__ 方法来解决这个问题。然后我这样做:

result = as_class()
for key,value in dict_expr.items():
        result.__setitem__(key,value)

在我的类里面, __setitem__ 方法是这样的:

def __setitem__(self,key,value):
     try:
        attr = getattr(class_obj,key)
        if(attr!=None):
            if(isinstance(value,dict)):
                for child_key,child_value in value.items(): 
                    attr.__setitem__(child_key,child_value)
                setattr(class_obj,key,attr)
            else:
                setattr(class_obj,key,value)

    except AttributeError:
       pass

撰写回答