Python Marshmallow Field может быть двух разных типов - PullRequest
1 голос
/ 05 мая 2020

Я хочу указать схему зефира. Я хочу, чтобы одно из моих полей было проверено, но это может быть ЛИБО строка или список строк. Я пробовал тип поля Raw, однако он пропускает все. Есть ли способ просто проверить два типа, которые мне нужны?

Что-то вроде

value = fields.Str() or fields.List()

1 Ответ

1 голос
/ 05 мая 2020

Сегодня у меня была такая же проблема, и я придумал следующее решение:

class ValueField(fields.Field):
    def _deserialize(self, value, attr, data, **kwargs):
        if isinstance(value, str) or isinstance(value, list):
            return value
        else:
            raise ValidationError('Field should be str or list')


class Foo(Schema):
    value = ValueField()
    other_field = fields.Integer()

Вы можете создать настраиваемое поле и перегрузить метод _deserialize, чтобы он проверял, соответствует ли код isinstance желаемых типов. Надеюсь, у вас это сработает.

foo.load({'value': 'asdf', 'other_field': 1})
>>> {'other_field': 1, 'value': 'asdf'}
foo.load({'value': ['asdf'], 'other_field': 1})
>>> {'other_field': 1, 'value': ['asdf']}
foo.load({'value': 1, 'other_field': 1})
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/Users/webinterpret/Envs/gl-gs-onboarding-api/lib/python3.7/site-packages/marshmallow/schema.py", line 723, in load
    data, many=many, partial=partial, unknown=unknown, postprocess=True
  File "/Users/webinterpret/Envs/gl-gs-onboarding-api/lib/python3.7/site-packages/marshmallow/schema.py", line 904, in _do_load
    raise exc
marshmallow.exceptions.ValidationError: {'value': ['Field should be str or list']}
...