15

Flask で SQLAlchemy 拡張機能を使用しています。jsonpickle を使用してモデル(データベース操作にも使用される)をシリアル化する際に、いくつかの特定の属性を無視したいと考えています。これらのルールを設定できる方法はありますか?

SQLAlchemy は、名前付きの属性_sa_instance_stateをオブジェクトに追加します。つまり、このフィールドを JSON 出力に含めたくありません。

4

2 に答える 2

23

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

jsonpickle pickleモジュール __getstate____setstate__メソッドをサポートします。クラスがこれら 2 つのメソッドを実装している場合、返されたものはすべてjsonpickle状態を表すために使用されます。どちらの方法も実装する必要があります。

が実装されていない場合__getstate__は、代わりに属性を使用するため、独自のバージョンで同じ辞書を使用するだけでよく、キーを削除すれば完了です。jsonpickle__dict___sa_instance_state

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

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

戻り値が何であれ__getstate__、再帰的にさらに処理されるため、そこでのサブオブジェクトの処理について心配する必要はありません。

__getstate__andを追加できない場合は、クラスのカスタム シリアライゼーション ハンドラ__setstate__を登録することもできます。欠点は、辞書を返すだけで済む一方で、カスタム ハンドラーは完全に平坦化された値を返す必要があることです。__getstate__

于 2013-08-09T13:30:28.790 に答える