Python 如何应用';从'加载#u;和';转储到';到棉花糖模式中的每个字段?
我一直在尝试实现一个“抽象”模式类,该类将自动将CamelCase(序列化)中的值转换为snake_case(反序列化) 虽然使用类似的方法可以很好地工作,但将Python 如何应用';从'加载#u;和';转储到';到棉花糖模式中的每个字段?,python,marshmallow,Python,Marshmallow,我一直在尝试实现一个“抽象”模式类,该类将自动将CamelCase(序列化)中的值转换为snake_case(反序列化) 虽然使用类似的方法可以很好地工作,但将load\u from和dump\u to应用到字段并不能实现所有功能。也就是说,当反序列化出现问题时,它无法提供正确的字段名。例如,我得到: {'something\u id':[u'不是有效整数。]}而不是{'somethingId':[u'不是有效整数。]} 虽然我可以对这些发出的错误进行后期处理,但如果要使模式的使用完全透明,我希
load\u from
和dump\u to
应用到字段并不能实现所有功能。也就是说,当反序列化出现问题时,它无法提供正确的字段名。例如,我得到:
{'something\u id':[u'不是有效整数。]}
而不是{'somethingId':[u'不是有效整数。]}
虽然我可以对这些发出的错误进行后期处理,但如果要使模式的使用完全透明,我希望避免这种不必要的耦合
有什么想法吗?我试着处理涉及的元类,但复杂度有点高,而且一切都异常丑陋。您正在使用棉花糖2。棉花糖3现在已经过时了,我建议使用它。我的答案适用于棉花糖3 在棉花糖3中,
load\u from
/dump\u to
已被单个属性替换:data\u key
在实例化模式时,您需要更改每个字段中的data\u key
。这将在字段实例化之后发生,但我认为这无关紧要
您希望在实例化模式时尽快这样做,以避免不一致性问题。这样做的正确时机将在\u init\u字段
是私有API,我建议在\u init\u
末尾进行修改
class CamelCaseSchema(Schema):
def __init__(self, **kwargs):
super().__init__(**kwargs)
for field_name, field in self.fields.items():
fields.data_key = utils.CaseConverter.snake_to_camel(field_name)
我没有试过,但我认为它应该会起作用。虽然我同意切换到棉花糖3是可取的,但在我目前的情况下是不可能的。对于其他使用版本2的用户,将
load_from
和dump_设置为
也同样有效。感谢您周到的回复,解决方案似乎非常有效!
class CamelCaseSchema(Schema):
def __init__(self, **kwargs):
super().__init__(**kwargs)
for field_name, field in self.fields.items():
fields.data_key = utils.CaseConverter.snake_to_camel(field_name)