棉花糖验证对象而不进行序列化



问题:我有一个带有一些值的对象和一个模式,该模式使用棉花糖为这样的对象定义字段和模式级别的验证。该模式可以验证序列化的数据,对于大多数用例来说,这就足够了。但是,当我想部分更新对象时,我必须序列化已经存在的对象,用新字段更新返回的字典,验证dict,然后将这些值重新分配给对象。这是运行架构级别验证所必需的。

问题:我想知道是否有更干净的方法来验证部分更新。例如,部分加载数据,将其分配给现有对象,并使用模式验证对象(这是不可能的,因为模式的验证功能只接受dicts(

注意:我不能只是重新创建对象,因为它与数据库同步。我必须分配新的值。

示例:

class Obj:
def __init__(self):
self.a = 1
self.b = 2

def update(self, **kwargs):
self.__dict__.update(kwargs)
class ObjSchema(Schema):
a = fields.Integer()
b = fields.Integer()
@validates_schema
def validate_whole_schema(self, data, **kwargs):
...

o = Obj()
sc = ObjSchema()
new_values = {
"a": 3
}
# ugly partial update
o_data = sc.dump(o)
o_data.update(new_values)
errors = sc.validate(o_data)
if errors:
...
else:
o.update(o_data)

您可能已经解决了这个问题,但Marshmallow schema.load((提供了一个"部分";标志,该标志将在加载架构时忽略丢失的字段。

请参阅以下资源:https://marshmallow.readthedocs.io/en/stable/quickstart.html#partial-加载

最新更新