2013-08-09 15 views
10

私はFlaskでSQLAlchemy拡張を使用しています。私のモデル(データベース操作にも使用されています)をシリアル化しているうちに、 jsonpickleを使用して、いくつかの特定の属性を無視します。私はそれらのルールを設定する方法がありますか?jsonpickleでシリアル化の特定のフィールドを除外する方法は?

SQLAlchemyは、_sa_instance_stateという名前の属性をオブジェクトに追加します。言い換えれば、私はこのフィールドをJSON出力にしたくありません。

答えて

8

デフォルトのクラスピックラーに何かを無視するように指示することはできません。

​​pickle module__getstate____setstate__メソッドをサポートしていません。あなたのクラスがこれらの2つのメソッドを実装している場合は、返されるものはすべて​​によって代わりに使用されます。両方の方法を実装する必要があります。

__getstate__は独自のバージョンは単に_sa_instance_stateキーを削除し、作業が完了し、その同じ辞書を使用する必要があるので​​が、代わりに__dict__属性を使用して、実装されていない場合:

ものは何でも __getstate__戻り
def __getstate__(self): 
    state = self.__dict__.copy() 
    del state['_sa_instance_state'] 
    return state 

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

再帰的に処理されるため、そこでサブオブジェクトを処理することを心配する必要はありません。

__getstate____setstate__を追加することはできません。クラスにcustom serialization handlerを登録することもできます。欠点は、__getstate__は辞書を返すだけでなくなりますが、カスタムハンドラは完全に平坦化された値を返す必要があることです。

+1

'__getstate__'と' __setstate__'を追加するのは今のところ魅力的です。ありがとうございます。モデルごとに同じコード行を書くのではなく、 '__dict__'から無視されたフィールドを削除するデコレータを実装することは、将来的には良いアイデアかもしれません。 – mkubilayk

+0

mkubilaykが将来の機能を望んでいるのは、.NETのxmlシリアル化の[XmlAttributes.XmlIgnore Property](https://msdn.microsoft.com/en-us/library/system.xml.serialization)と非常によく似ています。 .xmlattributes.xmlignore(v = vs.110).aspx) – jxramos

関連する問題