6

私はマシュマロ2.0.0rc2 を使用して、HTTP 要求の入力データを検証し、HTTP 応答で SQLAlchemy モデルを JSON にロードしています。そして、私は2つの問題に遭遇しました:

まず、HTTP PUT 要求で JSON からデータをロードしているときに、欠落しているすべてのフィールドを None として設定し、SQLAlchemy のデータを正しく上書きしたいと考えています。現在、次のコードを使用しています。

for name, field in schema.fields.iteritems():
    if field.missing == ma.missing:
        schema.fields[name].missing = None

動作しますが、クラスmarshmallow.Fieldにアタッチされたインスタンスをいじっているので、バグがあると思います。Schemaそして、Schemaインスタンスを破棄した後、パッチを適用したすべてのフィールドは、デフォルトのフィールドではなく、新しい行方不明のままになります。

次に、SQLAlchemy から JSON にデータをダンプするときに、不足しているすべてのフィールドが None として解決され、JSON にデータが取り込まれ{"key": null, }ます。post_dumpこれは望ましくない動作であり、トリガーでそれらをクリーニングしています。

@post_dump
def clean_missing(self, data):
    for key in filter(lambda key: data[key] is None, data):
        data.pop(key)
    return data

前と同じように動作していますが、BaseSchema継承されたすべてのクラスにこのロジックを渡すいくつかのクラス ウィッチの作成が含まれます。

しばらくドキュメントを検索しましたが、この動作を入れ替える正しい方法が見つかりませんでした。つまり、ダンプ時にフィールドをスキップしNone、ロード時にフィールドに入力します。私は何か不足していますか、それともマシュマロはそのような機能を提供していませんか?

4

1 に答える 1

1

ロード時に None を強制するには、次のmissingパラメーターを使用できます。

missing – 入力データにフィールドが見つからない場合のフィールドのデフォルトの逆シリアル化値。値または呼び出し可能オブジェクトの場合があります。

class ExampleSchema(Schema):
    field_a = fields.Int(missing=None)

2 番目の点については、2.0 以降、不足しているフィールドはシリアル化された出力から除外されるとドキュメントに記載されているようです。

于 2016-06-01T09:30:07.793 に答える