2013-08-09 17 views
10

Sto usando l'estensione SQLAlchemy con Flask. Mentre serializzo i miei modelli (che sono anche usati per le operazioni di database) usando jsonpickle, voglio che alcuni attributi specifici siano ignorati. C'è un modo che mi permetta di impostare quelle regole?Come escludere campi specifici sulla serializzazione con jsonpickle?

SQLAlchemy aggiunge un attributo denominato _sa_instance_state all'oggetto. In una parola, non voglio che questo campo sia nell'output JSON.

risposta

8

Non si può dire al selettore di classe predefinito di ignorare qualcosa, no.

jsonpicklefa sostegno delle pickle module__getstate__ e __setstate__ metodi. Se le tue classi implementano questi due metodi, qualsiasi cosa viene restituita viene quindi utilizzata da jsonpickle per rappresentare invece lo stato. Entrambi i metodi devono essere implementati.

Se __getstate__ è non implementato, jsonpickle utilizza l'attributo __dict__ invece, in modo dalla propria versione solo bisogno di usare lo stesso dizionario, rimuovere la chiave _sa_instance_state e si è fatto:

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

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

Qualunque siano __getstate__ rendimenti sarà elaborato ulteriormente, in modo ricorsivo, non c'è bisogno di preoccuparsi di gestire i sottooggetti lì.

Se l'aggiunta di __getstate__ e __setstate__ non è un'opzione, è possibile anche registrare un custom serialization handler per la classe; lo svantaggio è che mentre può farla finita con la restituzione di un dizionario, un gestore personalizzato dovrà restituire un valore completamente appiattito.

+1

L'aggiunta di '__getstate__' e' __setstate__' funziona come un incantesimo per ora, grazie. Invece di scrivere le stesse linee di codice per ogni modello, l'implementazione di un decoratore per rimuovere i campi ignorati da '__dict__' potrebbe essere una buona idea per il futuro. – mkubilayk

+0

I secondo ciò che mkubilayk desidera per una funzionalità futura, sarebbe molto analogo alla serializzazione xml di .NET [Proprietà XmlAttributes.XmlIgnore] (https://msdn.microsoft.com/en-us/library/system.xml.serialization .xmlattributes.xmlignore (v = vs.110) .aspx) – jxramos

Problemi correlati