项目中的更新依赖项
之前
marshmallow-sqlalchemy==0.17.0
marshmallow==3.0.0b6
之后
marshmallow-sqlalchemy==0.21.0
marshmallow==3.5.0
我有这样的模型(简体):
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class MyModel(Base):
__tablename__ = 'my_model'
id = Column(BigInteger, primary_key=True)
field_name = Column(String)
password = Column(String)
和模式:
from marshmallow import fields
from marshmallow_sqlalchemy import (
ModelSchema,
field_for,
)
class RegistrarSchema(ModelSchema):
class Meta:
model = MyModel
other_field_name = fields.Function(lambda obj: obj.field_name)
field_name = field_for(MyModel, 'field_name', load_from='other_field_name')
password = fields.Method("get_password")
def get_password(self, obj):
return decrypt_password(obj)
def load(self, data, session=None, instance=None, transient=False, *args, **kwargs):
if 'password' in data:
password = data['password']
instance = encrypt_password(password, instance)
return super(ModelSchema, self).load(
data, *args, session=session, instance=instance,
transient=transient, **kwargs
)
使用此代码,我可以致电
RegistrarSchema.load(data={'other_field_name': 'my_value'}, instance=instance, session=session)
,此值将保存到我的数据库中的field_name。
更新后,我失去了此功能-现在我得到了
File "myfile.py", line 116, in load
transient=transient, **kwargs
File "/usr/local/lib/python3.7/dist-packages/marshmallow_sqlalchemy/schema.py", line 214, in load
return super().load(data, **kwargs)
File "/usr/local/lib/python3.7/dist-packages/marshmallow/schema.py", line 723, in load
data, many=many, partial=partial, unknown=unknown, postprocess=True
File "/usr/local/lib/python3.7/dist-packages/marshmallow/schema.py", line 904, in _do_load
raise exc
marshmallow.exceptions.ValidationError: {'other_field_name': ['Unknown field.']}
并在更新密码时显示相同的错误-
RegistrarSchema.load(data={'password': 'my_value'}, instance=instance, session=session)
我没有亲自编写此代码,也无法联系开发者。
我知道,第一种情况的目标是赋予两种书写方式-data={'my_field': 'value'}
和data={'other_field_name': 'value'}
。第一种情况仍适用于新版本,但第二种情况不适用。
如果使用密码-目标是通过加密/解密数据使序列化/反序列化更加复杂。
我阅读了更新说明,但找不到与此问题相关的任何内容,有人可以帮忙吗?
答案 0 :(得分:0)
在 v3. 中,marshmallow 将默认行为从 EXCLUDE 更改为 RAISE https://marshmallow.readthedocs.io/en/stable/quickstart.html#handling-unknown-fields。
您可以通过在架构的类 Meta 中指定 unknown 来恢复到旧行为:
class UserSchema(Schema):
class Meta:
unknown = EXCLUDE
在实例化时,
schema = UserSchema(unknown=EXCLUDE)
或者在调用 load 时。
UserSchema().load(data, unknown=EXCLUDE)
load 中设置的未知选项值将覆盖实例化时应用的值,后者本身将覆盖类 Meta 中定义的值。