Marshmallow: dynamically choose Schema depending on data?

Viewed 227

For googlers also that question in github.

I had users of 2 types. I need to validate user data by one of 2 schemas. I prepare awesome scratch with code of my idea, of course its not working.

class ExtraType0(Schema):
    nickname = fields.String()


class ExtraType1(Schema):
    id = fields.Integer()


class UserSchema(Schema):
    type = fields.String()
    extra = fields.Method(deserialize="get_extra_schema_by_user_type")

    def get_extra_schema_by_user_type(self, obj):
        if obj == 0:
            # call ExtraType0 scheme and its (de)serialization
            return fields.Nested(ExtraType0())
        else:
            # call ExtraType01scheme and its (de)serialization
            return fields.Nested(ExtraType1())

# correct data
result = UserSchema().load(
    {
        "type": 0,
        "extra": {
           "id": 0
        }
    })

# also correct data
result1 = UserSchema().load(
    {
        "type": 1,
        "extra": {
           "nickname": "user123"
        }
    })

How I can proper choose schema depends on loaded in type field data?

0 Answers
Related