PyMongo: синтаксический анализ | сериализация вывода запроса коллекции

#python #mongodb #pymongo

#python #mongodb #pymongo

Вопрос:

По умолчанию collection.find or collection.findone() functions приводит к типу словаря, и если вы передадите paramater as_class=SomeUserClass , он попытается проанализировать результат в этом формате класса. но, похоже, этот класс также должен быть производным классом dictionary (поскольку для этого требуется __setitem__ определить функцию, и я могу добавить ключи в класс). Здесь я хочу задать свойства класса. как я могу этого добиться? Кроме того, мой класс collection содержит некоторые дочерние классы в качестве свойств .Итак, как я могу также установить свойства дочерних классов.

Ответ №1:

Похоже, вам нужно что-то вроде объектно-реляционного картографа. Я являюсь основным автором одного 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
  

Ниже перечислены различные ODM, о которых я знаю для MongoDB в Python.

Комментарии:

1. Я должен также упомянуть, что вы можете установить тип поля в своем валидаторе Ming, поэтому, если вы хотите использовать пользовательский конвертер dict-to-object, вы можете сделать это, написав пользовательский ming.schema. Элемент схемы.

Ответ №2:

Я решил это, добавив __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