2013-08-09 7 views
10

Ich benutze SQLAlchemy Erweiterung mit Flask. Beim Serialisieren meiner Modelle (die auch für Datenbankoperationen verwendet werden) mit jsonpickle möchte ich einige bestimmte Attribute ignoriert werden. Gibt es eine Möglichkeit, diese Regeln festzulegen?Wie bestimmte Felder bei der Serialisierung mit jsonpickle auszuschließen?

SQLAlchemy fügt dem Objekt ein Attribut _sa_instance_state hinzu. Kurz gesagt, ich möchte nicht, dass dieses Feld in der JSON-Ausgabe enthalten ist.

Antwort

8

Sie können nicht sagen, dass der Standard-Klassen-Abbeißer etwas ignoriert, nein.

jsonpickletut Unterstützung der pickle module__getstate__ und __setstate__ Methoden. Wenn Ihre Klassen diese beiden Methoden implementieren, wird das, was zurückgegeben wird, von jsonpickle verwendet, um stattdessen den Status darzustellen. Beide Methoden müssen implementiert werden.

Wenn __getstate__ ist nicht implementiert, jsonpickle verwendet das __dict__ Attribut statt, so dass Ihre eigene Version muss lediglich das gleiche Wörterbuch verwenden, entfernen Sie die _sa_instance_state Schlüssel und Sie sind fertig:

def __getstate__(self): 
    state = self.__dict__.copy() 
    del state['_sa_instance_state'] 
    return state 

def __setstate__(self, state): 
    self.__dict__.update(state) 

Was auch immer __getstate__ Renditen Wird rekursiv weiterverarbeitet, müssen Sie sich keine Gedanken über die Behandlung von Unterobjekten machen.

Wenn das Hinzufügen von __getstate__ und __setstate__ keine Option ist, können Sie auch einen custom serialization handler für Ihre Klasse registrieren; der Nachteil ist, dass während __getstate__ mit nur ein Wörterbuch zurückgeben kann, muss ein benutzerdefinierter Handler einen vollständig abgeflachten Wert zurückgeben.

+1

Das Hinzufügen von '__getstate__' und' __setstate__' funktioniert jetzt wie ein Zauber, danke. Anstatt für jedes Modell die gleichen Codezeilen zu schreiben, ist die Implementierung eines Dekorators zum Entfernen ignorierter Felder aus "__dict__" möglicherweise eine gute Idee für die Zukunft. – mkubilayk

+0

Ich zweitens, was Mkubilayk für ein zukünftiges Feature wünscht, würde es sehr analog zu .NET Xml Serialisierung [XmlAttributes.XmlIgnore-Eigenschaft] (https://msdn.microsoft.com/en-us/library/system.xml.serialization .xmlattributes.xmlignore (v = vs.110) .aspx) – jxramos

Verwandte Themen