Frage

Standardmäßig collection.find oder collection.findone() Funktionen führen zu einem Wörterbuchtyp und wenn Sie Paramater übergeben as_class=SomeUserClass als versucht es, das Ergebnis in dieses Klassenformat zu analysieren. Aber es scheint, dass diese Klasse auch abgeleitete Klasse von Wörterbuchstaben sein sollte (wie es erforderlich ist __setitem__ Funktion zu definiert werden und ich kann Schlüssel in der Klasse hinzufügen). Hier möchte ich die Eigenschaften der Klasse festlegen. Wie kann ich das erreichen? Außerdem enthält meine Sammelklasse einige Kinderklassen als Eigenschaften. Wie kann ich auch die Eigenschaften von Kinderklassen festlegen?

War es hilfreich?

Lösung 2

Ich habe dies durch Hinzufügen gelöst __setitem__ im Unterricht. als ich

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

Und in meiner Klasse __setitem__ ist wie

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

Andere Tipps

Es hört sich so an, als ob Sie so etwas wie ein Objektrelations-Mapper wollen. Ich bin der Hauptautor von einem Ming , aber es gibt auch mehrere andere für Python. In Ming können Sie Folgendes tun, um Ihre Zuordnung einzurichten:

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()

Anschließend können Sie eine bestimmte Seite abfragen über:

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

Die verschiedenen ODMs, die ich für MongoDB in Python kenne, sind unten aufgeführt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top