marshmallow のschemaにデフォルト値を設定したい。
load/dumpのデフォルト値
marshmallowでは以下のような対応になっている。
-
load()
-- 文字列表現をオブジェクト表現をする処理(deserialization) -
dump()
-- オブジェクト表現を文字列表現にする処理(serialization)
これら2つのそれぞれについてデフォルト値を設定するオプションがある。
-
load()
--missing
-
dump()
--default
以下の様にして使う。
from marshmallow import Schema, fields
class S(Schema):
n = fields.Integer(missing=1, default=-1)
print(S().load({}))
# UnmarshalResult(data={'n': 1}, errors={})
print(S().dump({}))
# MarshalResult(data={'n': -1}, errors={})
collectionの値に対してdefault値を設定したい場合
many=True
は関係無いので注意。コレクションの値のfieldsは fields.List
を使う。
from marshmallow import Schema, fields
class S(Schema):
nums = fields.List(fields.Integer(), missing=[1, 2, 3], default=[-1, -2, -3])
# # 以下ではない
# class S(Schema):
# nums = fields.Integer(many=True, missing=[1, 2, 3], default=[-1, -2, -3])
print(S().load({}))
# UnmarshalResult(data={'nums': [1, 2, 3]}, errors={})
print(S().dump({}))
# MarshalResult(data={'nums': [-1, -2, -3]}, errors={})
ただしlistはmutableなので以下のように関数で包んだほうが無難
from marshmallow import Schema, fields
class S(Schema):
nums = fields.List(fields.Integer(), missing=lambda: [1, 2, 3], default=lambda: [-1, -2, -3])