1from marshmallow import Schema, fields
2
3
4def camelcase(s):
5    parts = iter(s.split("_"))
6    return next(parts) + "".join(i.title() for i in parts)
7
8
9class CamelCaseSchema(Schema):
10    """Schema that uses camel-case for its external representation
11    and snake-case for its internal representation.
12    """
13
14    def on_bind_field(self, field_name, field_obj):
15        field_obj.data_key = camelcase(field_obj.data_key or field_name)
16
17
18# -----------------------------------------------------------------------------
19
20
21class UserSchema(CamelCaseSchema):
22    first_name = fields.Str(required=True)
23    last_name = fields.Str(required=True)
24
25
26schema = UserSchema()
27loaded = schema.load({"firstName": "David", "lastName": "Bowie"})
28print(loaded)  # => {'last_name': 'Bowie', 'first_name': 'David'}
29dumped = schema.dump(loaded)
30print(dumped)  # => {'lastName': 'Bowie', 'firstName': 'David'}
31